public void onApplicationEvent()

in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/multitenancy/MultiTenantEventListener.java [38:86]


    public void onApplicationEvent(ApplicationEvent event) {
        if(supportsEventType(event.getClass())) {
            Datastore hibernateDatastore = (Datastore) event.getSource();
            if(event instanceof  PreQueryEvent) {
                PreQueryEvent preQueryEvent = (PreQueryEvent) event;
                Query query = preQueryEvent.getQuery();

                PersistentEntity entity = query.getEntity();
                if(entity.isMultiTenant()) {
                    if(hibernateDatastore == null) {
                        hibernateDatastore = GormEnhancer.findDatastore(entity.getJavaClass());
                    }
                    if(supportsSourceType(hibernateDatastore.getClass())) {
                        ((AbstractHibernateDatastore)hibernateDatastore).enableMultiTenancyFilter();
                    }
                }
            }
            else if((event instanceof ValidationEvent) || (event instanceof PreInsertEvent) || (event instanceof PreUpdateEvent)) {
                AbstractPersistenceEvent preInsertEvent = (AbstractPersistenceEvent) event;
                PersistentEntity entity = preInsertEvent.getEntity();
                if(entity.isMultiTenant()) {
                    TenantId tenantId = entity.getTenantId();
                    if(hibernateDatastore == null) {
                        hibernateDatastore = GormEnhancer.findDatastore(entity.getJavaClass());
                    }
                    if(supportsSourceType(hibernateDatastore.getClass())) {
                        Serializable currentId;

                        if(hibernateDatastore instanceof MultiTenantCapableDatastore) {
                            currentId = Tenants.currentId((MultiTenantCapableDatastore) hibernateDatastore);
                        }
                        else {
                            currentId = Tenants.currentId(hibernateDatastore.getClass());
                        }
                        if(currentId != null) {
                            try {
                                if(currentId == ConnectionSource.DEFAULT) {
                                    currentId = (Serializable) preInsertEvent.getEntityAccess().getProperty(tenantId.getName());
                                }
                                preInsertEvent.getEntityAccess().setProperty(tenantId.getName(), currentId);
                            } catch (Exception e) {
                                throw new TenantException("Could not assigned tenant id ["+currentId+"] to property ["+tenantId+"], probably due to a type mismatch. You should return a type from the tenant resolver that matches the property type of the tenant id!: " + e.getMessage(), e);
                            }
                        }
                    }
                }
            }
        }
    }