Skip to content

Commit

Permalink
Merge branch '2.1.x' of github.com:grails/grails-core into 2.1.x
Browse files Browse the repository at this point in the history
  • Loading branch information
graemerocher committed Feb 21, 2013
2 parents c833955 + 0df9f91 commit 9093d93
Showing 1 changed file with 57 additions and 4 deletions.
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -25,14 +25,20 @@


import org.codehaus.groovy.grails.commons.AnnotationDomainClassArtefactHandler; import org.codehaus.groovy.grails.commons.AnnotationDomainClassArtefactHandler;
import org.codehaus.groovy.grails.commons.DomainClassArtefactHandler; import org.codehaus.groovy.grails.commons.DomainClassArtefactHandler;
import org.codehaus.groovy.grails.commons.GrailsApplication;
import org.codehaus.groovy.grails.commons.GrailsDomainClass;
import org.codehaus.groovy.grails.commons.GrailsDomainClassProperty;
import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder;
import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsHibernateUtil; import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsHibernateUtil;
import org.codehaus.groovy.grails.orm.hibernate.cfg.Mapping;
import org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventListener; import org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventListener;
import org.codehaus.groovy.grails.orm.hibernate.support.SoftKey; import org.codehaus.groovy.grails.orm.hibernate.support.SoftKey;
import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent;
import org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener; import org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener;
import org.grails.datastore.mapping.engine.event.ValidationEvent; import org.grails.datastore.mapping.engine.event.ValidationEvent;
import org.hibernate.HibernateException; import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.event.PostDeleteEvent; import org.hibernate.event.PostDeleteEvent;
import org.hibernate.event.PostInsertEvent; import org.hibernate.event.PostInsertEvent;
import org.hibernate.event.PostLoadEvent; import org.hibernate.event.PostLoadEvent;
Expand All @@ -42,6 +48,9 @@
import org.hibernate.event.PreLoadEvent; import org.hibernate.event.PreLoadEvent;
import org.hibernate.event.PreUpdateEvent; import org.hibernate.event.PreUpdateEvent;
import org.hibernate.event.SaveOrUpdateEvent; import org.hibernate.event.SaveOrUpdateEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEvent;


/** /**
Expand All @@ -61,6 +70,8 @@ public class EventTriggeringInterceptor extends AbstractPersistenceEventListener
private boolean failOnError; private boolean failOnError;
private List<?> failOnErrorPackages = Collections.emptyList(); private List<?> failOnErrorPackages = Collections.emptyList();


protected Logger log = LoggerFactory.getLogger(getClass());

public EventTriggeringInterceptor(HibernateDatastore datastore, ConfigObject co) { public EventTriggeringInterceptor(HibernateDatastore datastore, ConfigObject co) {
super(datastore); super(datastore);


Expand Down Expand Up @@ -211,10 +222,9 @@ private ClosureEventListener findEventListener(Object entity) {
synchronized(clazz) { synchronized(clazz) {
eventListener = eventListeners.get(key); eventListener = eventListeners.get(key);
if (eventListener == null) { if (eventListener == null) {
shouldTrigger = (entity != null && shouldTrigger = (GroovySystem.getMetaClassRegistry().getMetaClass(entity.getClass()) != null &&
(GroovySystem.getMetaClassRegistry().getMetaClass(entity.getClass()) != null) && (DomainClassArtefactHandler.isDomainClass(clazz) || AnnotationDomainClassArtefactHandler.isJPADomainClass(clazz)) &&
(DomainClassArtefactHandler.isDomainClass(clazz) || isDefinedByCurrentDataStore(entity));
AnnotationDomainClassArtefactHandler.isJPADomainClass(clazz)));
if (shouldTrigger) { if (shouldTrigger) {
eventListener = new ClosureEventListener(clazz, failOnError, failOnErrorPackages); eventListener = new ClosureEventListener(clazz, failOnError, failOnErrorPackages);
ClosureEventListener previous = eventListeners.putIfAbsent(key, eventListener); ClosureEventListener previous = eventListeners.putIfAbsent(key, eventListener);
Expand All @@ -229,6 +239,49 @@ private ClosureEventListener findEventListener(Object entity) {
return eventListener; return eventListener;
} }


protected boolean isDefinedByCurrentDataStore(Object entity) {
SessionFactory currentDataStoreSessionFactory = ((HibernateDatastore) datastore).getSessionFactory();
ApplicationContext applicationContext = datastore.getApplicationContext();

Mapping mapping = GrailsDomainBinder.getMapping(entity.getClass());
List<String> dataSourceNames = null;
if (mapping == null) {
GrailsApplication grailsApplication = applicationContext.getBean("grailsApplication", GrailsApplication.class);
GrailsDomainClass dc = (GrailsDomainClass) grailsApplication.getArtefact(DomainClassArtefactHandler.TYPE, entity.getClass().getName());
if (dc != null) {
dataSourceNames = GrailsHibernateUtil.getDatasourceNames(dc);
}
}
else {
dataSourceNames = mapping.getDatasources();
}

if (dataSourceNames == null) {
return false;
}

for (String dataSource : dataSourceNames) {
if (GrailsDomainClassProperty.ALL_DATA_SOURCES.equals(dataSource)) {
return true;
}
boolean isDefault = dataSource.equals(GrailsDomainClassProperty.DEFAULT_DATA_SOURCE);
String suffix = isDefault ? "" : "_" + dataSource;
String sessionFactoryBeanName = "sessionFactory" + suffix;

if (applicationContext.containsBean(sessionFactoryBeanName)) {
SessionFactory sessionFactory = applicationContext.getBean(sessionFactoryBeanName, SessionFactory.class);
if (currentDataStoreSessionFactory == sessionFactory) {
return true;
}
}
else {
log.warn("Cannot resolve SessionFactory for dataSource {} and entity {}",
new Object[] { dataSource, entity.getClass().getName()});
}
}
return false;
}

/** /**
* {@inheritDoc} * {@inheritDoc}
* @see org.springframework.context.event.SmartApplicationListener#supportsEventType( * @see org.springframework.context.event.SmartApplicationListener#supportsEventType(
Expand Down

0 comments on commit 9093d93

Please sign in to comment.