All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.compass.gps.device.hibernate.embedded.HibernateHelper Maven / Gradle / Ivy

/*
 * Copyright 2004-2009 the original author or authors.
 *
 * Licensed 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
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * 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.compass.gps.device.hibernate.embedded;

import java.util.Properties;

import org.compass.core.Compass;
import org.compass.core.CompassTemplate;
import org.compass.gps.CompassGps;
import org.compass.gps.device.hibernate.HibernateGpsDevice;
import org.compass.gps.impl.SingleCompassGps;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.event.PostInsertEventListener;
import org.hibernate.impl.SessionFactoryImpl;

/**
 * A helper class used when working with embedded Compass within Hibernate. Allows for access to the
 * {@link org.compass.core.Compass} and {@link org.compass.gps.CompassGps} instances.
 *
 * @author kimchy
 */
public abstract class HibernateHelper {

    private HibernateHelper() {
    }

    /**
     * Returns the Compass instance associated with the given Hibernate from the Hibernate session.
     */
    public static Compass getCompass(Session session) {
        return findEventListener(session).getCompass();
    }

    /**
     * Returns a CompassTemplate instance associated with the given Hibernate from the Hibernate session.
     */
    public static CompassTemplate getCompassTempalte(Session session) {
        return new CompassTemplate(findEventListener(session).getCompass());
    }

    /**
     * Returns the Compass instance associated with the given Hibernate from the Hiberante session factory.
     */
    public static Compass getCompass(SessionFactory sessionFactory) {
        return findEventListener(sessionFactory).getCompass();
    }

    /**
     * Returns the CompassTemplate instance associated with the given Hibernate from the Hiberante session factory.
     */
    public static CompassTemplate getCompassTempalte(SessionFactory sessionFactory) {
        return new CompassTemplate(findEventListener(sessionFactory).getCompass());
    }

    /**
     * Returns the settings of the indexing Compass instance (from the CompassGps) associated with Hibernate
     * based on the provided Hibernate session.
     */
    public static Properties getIndexSettings(Session session) {
        return findEventListener(session).getIndexSettings();
    }

    /**
     * Returns the settings of the indexing Compass instance (from the CompassGps) associated with Hibernate
     * based on the provided Hibernate session factory.
     */
    public static Properties getIndexSettings(SessionFactory sessionFactory) {
        return findEventListener(sessionFactory).getIndexSettings();
    }

    /**
     * Retruns a {@link org.compass.gps.CompassGps} based on the Compass instance associated with the
     * Hibernate session factory.
     */
    public static CompassGps getCompassGps(SessionFactory sessionFactory) {
        HibernateGpsDevice device = new HibernateGpsDevice("hibernate", sessionFactory);
        return getCompassGps(device);
    }

    /**
     * Returns a {@link org.compass.gps.CompassGps} to wrap the provided Hibernat Gps device.
     */
    public static CompassGps getCompassGps(HibernateGpsDevice device) {
        SingleCompassGps gps = new SingleCompassGps(getCompass(device.getSessionFactory()));
        device.setMirrorDataChanges(false);
        gps.setIndexProperties(getIndexSettings(device.getSessionFactory()));
        gps.addGpsDevice(device);
        gps.start();
        return gps;
    }

    private static CompassEventListener findEventListener(SessionFactory sessionFactory) {
        if (sessionFactory instanceof SessionFactoryImpl) {
            PostInsertEventListener[] listeners = ((SessionFactoryImpl) sessionFactory).getEventListeners().getPostInsertEventListeners();
            return findEventListener(listeners);
        } else {
            Session session = sessionFactory.openSession();
            try {
                return findEventListener(session);
            } finally {
                session.close();
            }
        }
    }

    private static CompassEventListener findEventListener(Session session) {
        PostInsertEventListener[] listeners = ((SessionImplementor) session).getListeners().getPostInsertEventListeners();
        return findEventListener(listeners);
    }

    private static CompassEventListener findEventListener(PostInsertEventListener[] listeners) {
        for (PostInsertEventListener candidate : listeners) {
            if (candidate instanceof CompassEventListener) {
                return (CompassEventListener) candidate;
            }
        }
        throw new HibernateException(
                "Compass Event listeners not configured, please check the reference documentation and the " +
                        "application's hibernate.cfg.xml");
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy