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);
}
}
}
}
}
}
}