protected ClosureEventListener findEventListener()

in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/event/listener/HibernateEventListener.java [180:211]


    protected ClosureEventListener findEventListener(Object entity, SessionFactoryImplementor factory) {
        if (entity == null) return null;
        Class<?> clazz = Hibernate.getClass(entity);

        SoftKey<Class<?>> key = new SoftKey<Class<?>>(clazz);
        ClosureEventListener eventListener = eventListeners.get(key);
        if (eventListener != null) {
            return eventListener;
        }

        Boolean shouldTrigger = cachedShouldTrigger.get(key);
        if (shouldTrigger == null || shouldTrigger) {
            synchronized(cachedShouldTrigger) {
                eventListener = eventListeners.get(key);
                if (eventListener == null) {
                    AbstractHibernateDatastore datastore = getDatastore();
                    boolean isValidSessionFactory = MultiTenant.class.isAssignableFrom(clazz) || factory == null || datastore.getSessionFactory().equals(factory);
                    PersistentEntity persistentEntity = datastore.getMappingContext().getPersistentEntity(clazz.getName());
                    shouldTrigger = (persistentEntity != null && isValidSessionFactory);
                    if (shouldTrigger) {
                        eventListener = new ClosureEventListener(persistentEntity, failOnError, failOnErrorPackages);
                        ClosureEventListener previous = eventListeners.putIfAbsent(key, eventListener);
                        if (previous != null) {
                            eventListener = previous;
                        }
                    }
                    cachedShouldTrigger.put(key, shouldTrigger);
                }
            }
        }
        return eventListener;
    }