org.compass.gps.device.hibernate.dep.Hibernate3GpsDevice Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of compass Show documentation
Show all versions of compass Show documentation
Compass Search Engine Framework
/*
* Copyright 2004-2006 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.dep;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.compass.core.CompassCallbackWithoutResult;
import org.compass.core.CompassException;
import org.compass.core.CompassSession;
import org.compass.core.mapping.CascadeMapping;
import org.compass.core.mapping.ResourceMapping;
import org.compass.core.spi.InternalCompassSession;
import org.compass.core.util.ClassUtils;
import org.compass.core.util.FieldInvoker;
import org.compass.core.util.MethodInvoker;
import org.compass.gps.CompassGpsException;
import org.compass.gps.PassiveMirrorGpsDevice;
import org.compass.gps.device.hibernate.HibernateGpsDeviceException;
import org.hibernate.EntityMode;
import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.event.PostDeleteEvent;
import org.hibernate.event.PostDeleteEventListener;
import org.hibernate.event.PostInsertEvent;
import org.hibernate.event.PostInsertEventListener;
import org.hibernate.event.PostUpdateEvent;
import org.hibernate.event.PostUpdateEventListener;
import org.hibernate.impl.SessionFactoryImpl;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.persister.entity.AbstractEntityPersister;
/**
* A hibernate device which works with hibernate 3.
*
* You must either set the Hibernate Configuration
or the
* SessionFactory
to be used by the device. Note that if the
* Configuration
is supplied, when the device start
* is called, a new SessionFactory
will be built.
*
* Provides support for real time index updates using the new Hibernate 3 event
* system. The device uses the PostInsertEventListener
,
* PostUpdateEventListener
, and
* PostDeleteEventListener
events.
*
* @author kimchy
* @deprecated Please use {@link org.compass.gps.device.hibernate.HibernateGpsDevice}.
*/
public class Hibernate3GpsDevice extends AbstractHibernateGpsDevice implements PassiveMirrorGpsDevice {
public class Hibernate3SessionWrapper implements HibernateSessionWrapper {
private SessionFactory sessionFactory;
private Session session;
private Transaction tr;
public Hibernate3SessionWrapper(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session getSession() {
return session;
}
public void open() throws HibernateGpsDeviceException {
try {
session = sessionFactory.openSession();
session.setFlushMode(FlushMode.NEVER);
} catch (HibernateException e) {
throw new HibernateGpsDeviceException(buildMessage("Failed to open session to fetch data"), e);
}
try {
tr = session.beginTransaction();
} catch (HibernateException e) {
throw new HibernateGpsDeviceException(buildMessage("Failed to begin transaction to fetch data"), e);
}
}
public void close() {
if (tr != null) {
try {
tr.commit();
} catch (HibernateException e) {
throw new HibernateGpsDeviceException("Failed to commit hibernate transaction");
}
}
try {
session.close();
} catch (HibernateException e) {
log.error("Failed to close Hibernate session", e);
}
}
public void closeOnError() {
if (tr != null) {
try {
tr.rollback();
} catch (HibernateException e1) {
log.error(buildMessage("Failed to rollback hibernate transaction"), e1);
}
}
try {
session.close();
} catch (HibernateException e) {
log.error(buildMessage("Failed to close Hibernate session"), e);
}
}
}
private class Hibernate3GpsDevicePostInsert implements PostInsertEventListener {
private static final long serialVersionUID = 3544677273799308593L;
private PostInsertEventListener postInsertEventListener;
private HibernateMirrorFilter mirrorFilter;
public Hibernate3GpsDevicePostInsert(PostInsertEventListener postInsertEventListener,
HibernateMirrorFilter mirrorFilter) {
this.postInsertEventListener = postInsertEventListener;
this.mirrorFilter = mirrorFilter;
}
public PostInsertEventListener getPostInsertEventListener() {
return postInsertEventListener;
}
public void onPostInsert(final PostInsertEvent postInsertEvent) {
if (this.postInsertEventListener != null) {
this.postInsertEventListener.onPostInsert(postInsertEvent);
}
if (!shouldMirrorDataChanges() || isPerformingIndexOperation()) {
return;
}
final Object entity = postInsertEvent.getEntity();
if (!compassGps.hasMappingForEntityForMirror(entity.getClass(), CascadeMapping.Cascade.CREATE)) {
return;
}
if (mirrorFilter != null) {
if (mirrorFilter.shouldFilterInsert(postInsertEvent)) {
return;
}
}
try {
if (log.isDebugEnabled()) {
log.debug(buildMessage("Creating [" + entity + "]"));
}
compassGps.executeForMirror(new CompassCallbackWithoutResult() {
protected void doInCompassWithoutResult(CompassSession session) throws CompassException {
((InternalCompassSession) session).getMarshallingStrategy().marshallIds(entity,
postInsertEvent.getId());
session.create(entity);
}
});
} catch (Exception e) {
if (isIgnoreMirrorExceptions()) {
log.error(buildMessage("Failed while creating [" + entity + "]"), e);
} else {
throw new HibernateGpsDeviceException(buildMessage("Failed while creating [" + entity + "]"), e);
}
}
}
}
private class Hibernate3GpsDevicePostUpdate implements PostUpdateEventListener {
private static final long serialVersionUID = 3833181428363113528L;
private PostUpdateEventListener postUpdateEventListener;
private HibernateMirrorFilter mirrorFilter;
public Hibernate3GpsDevicePostUpdate(PostUpdateEventListener postUpdateEventListener,
HibernateMirrorFilter mirrorFilter) {
this.postUpdateEventListener = postUpdateEventListener;
this.mirrorFilter = mirrorFilter;
}
public PostUpdateEventListener getPostUpdateEventListener() {
return postUpdateEventListener;
}
public void onPostUpdate(final PostUpdateEvent postUpdateEvent) {
if (this.postUpdateEventListener != null) {
this.postUpdateEventListener.onPostUpdate(postUpdateEvent);
}
if (!shouldMirrorDataChanges() || isPerformingIndexOperation()) {
return;
}
final Object entity = postUpdateEvent.getEntity();
if (!compassGps.hasMappingForEntityForMirror(entity.getClass(), CascadeMapping.Cascade.SAVE)) {
return;
}
if (mirrorFilter != null) {
if (mirrorFilter.shouldFilterUpdate(postUpdateEvent)) {
return;
}
}
try {
if (log.isDebugEnabled()) {
log.debug(buildMessage("Updating [" + entity + "]"));
}
compassGps.executeForMirror(new CompassCallbackWithoutResult() {
protected void doInCompassWithoutResult(CompassSession session) throws CompassException {
session.save(entity);
}
});
} catch (Exception e) {
if (isIgnoreMirrorExceptions()) {
log.error(buildMessage("Failed while updating [" + entity + "]"), e);
} else {
throw new HibernateGpsDeviceException(buildMessage("Failed while updating [" + entity + "]"), e);
}
}
}
}
private class Hibernate3GpsDevicePostDelete implements PostDeleteEventListener {
private static final long serialVersionUID = 3258126955726385720L;
private PostDeleteEventListener postDeleteEventListener;
private HibernateMirrorFilter mirrorFilter;
public Hibernate3GpsDevicePostDelete(PostDeleteEventListener postDeleteEventListener,
HibernateMirrorFilter mirrorFilter) {
this.postDeleteEventListener = postDeleteEventListener;
this.mirrorFilter = mirrorFilter;
}
public PostDeleteEventListener getPostDeleteEventListener() {
return postDeleteEventListener;
}
public void onPostDelete(final PostDeleteEvent postDeleteEvent) {
if (this.postDeleteEventListener != null) {
this.postDeleteEventListener.onPostDelete(postDeleteEvent);
}
if (!shouldMirrorDataChanges() || isPerformingIndexOperation()) {
return;
}
final Object entity = postDeleteEvent.getEntity();
if (!compassGps.hasMappingForEntityForMirror(entity.getClass(), CascadeMapping.Cascade.DELETE)) {
return;
}
if (mirrorFilter != null) {
if (mirrorFilter.shouldFilterDelete(postDeleteEvent)) {
return;
}
}
try {
if (log.isDebugEnabled()) {
log.debug(buildMessage("Deleting [" + entity + "]"));
}
compassGps.executeForMirror(new CompassCallbackWithoutResult() {
protected void doInCompassWithoutResult(CompassSession session) throws CompassException {
session.delete(entity);
}
});
} catch (Exception e) {
if (isIgnoreMirrorExceptions()) {
log.error(buildMessage("Failed while deleting [" + entity + "]"), e);
} else {
throw new HibernateGpsDeviceException(buildMessage("Failed while deleting [" + entity + "]"), e);
}
}
}
}
private boolean mirrorDataChanges = true;
private SessionFactory sessionFactory;
private Configuration configuration;
private HibernateMirrorFilter mirrorFilter;
private boolean ignoreMirrorExceptions;
public Hibernate3GpsDevice() {
}
public Hibernate3GpsDevice(String name, SessionFactory sessionFactory) {
setName(name);
this.sessionFactory = sessionFactory;
}
public Hibernate3GpsDevice(String name, Configuration configuration) {
setName(name);
this.configuration = configuration;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void setConfiguration(Configuration configuration) {
this.configuration = configuration;
}
/**
* Sets a mirroring filter that can filter hibernate mirror events. If no mirror filter is set
* no filtering will happen.
*
* @param mirrorFilter The mirror filter handler
*/
public void setMirrorFilter(HibernateMirrorFilter mirrorFilter) {
this.mirrorFilter = mirrorFilter;
}
protected void doStart() throws CompassGpsException {
super.doStart();
if (sessionFactory == null) {
if (configuration == null) {
throw new HibernateGpsDeviceException(buildMessage("Must set configuration or sessionFactory"));
}
try {
sessionFactory = configuration.buildSessionFactory();
} catch (HibernateException e) {
throw new HibernateGpsDeviceException(buildMessage("Failed to create session factory"), e);
}
}
if (isMirrorDataChanges()) {
SessionFactory actualSessionFactory = doGetActualSessionFactory();
try {
ClassUtils.forName("org.hibernate.event.SessionEventListenerConfig", compassGps.getMirrorCompass().getSettings().getClassLoader());
registerEventsForHibernate30(actualSessionFactory);
} catch (ClassNotFoundException e) {
registerEventsForHibernate31(actualSessionFactory);
}
}
}
protected void doStop() throws CompassGpsException {
if (isMirrorDataChanges()) {
SessionFactory actualSessionFactory = doGetActualSessionFactory();
try {
ClassUtils.forName("org.hibernate.event.SessionEventListenerConfig", compassGps.getMirrorCompass().getSettings().getClassLoader());
unregisterEventsForHibernate30(actualSessionFactory);
} catch (ClassNotFoundException e) {
unregisterEventsForHibernate31(actualSessionFactory);
}
}
}
/**
* A helper method that returns the actual session factory for event
* registration. Can be used by subclasses if the
* SessionFactory
is proxied.
*/
protected SessionFactory doGetActualSessionFactory() {
return this.sessionFactory;
}
public boolean isMirrorDataChanges() {
return mirrorDataChanges;
}
public void setMirrorDataChanges(boolean mirrorDataChanges) {
this.mirrorDataChanges = mirrorDataChanges;
}
/**
* Should exceptions be ignored during the mirroring operations (the Hibernate event listeners).
* Defaults to false
.
*/
public boolean isIgnoreMirrorExceptions() {
return ignoreMirrorExceptions;
}
/**
* Should exceptions be ignored during the mirroring operations (the Hibernate event listeners).
* Defaults to false
.
*/
public void setIgnoreMirrorExceptions(boolean ignoreMirrorExceptions) {
this.ignoreMirrorExceptions = ignoreMirrorExceptions;
}
protected HibernateSessionWrapper doGetHibernateSessionWrapper() {
return new Hibernate3SessionWrapper(sessionFactory);
}
protected HibernateEntityInfo[] doGetHibernateEntitiesInfo() throws HibernateGpsDeviceException {
ArrayList infos = new ArrayList();
try {
Map allClassMetaData = sessionFactory.getAllClassMetadata();
for (Iterator it = allClassMetaData.keySet().iterator(); it.hasNext();) {
String entityname = (String) it.next();
ClassMetadata classMetadata = (ClassMetadata) allClassMetaData.get(entityname);
// if it is inherited, do not add it to the classes to index, since the "from [entity]"
// query for the base class will return results for this class as well
if (isInherited(classMetadata)) {
String superClassEntityName = ((AbstractEntityPersister) classMetadata).getMappedSuperclass();
ClassMetadata superClassMetadata = (ClassMetadata) allClassMetaData.get(superClassEntityName);
Class superClass = superClassMetadata.getMappedClass(EntityMode.POJO);
// only filter out classes that their super class has compass mappings
if (superClass != null && compassGps.hasMappingForEntityForIndex(superClass)) {
if (log.isDebugEnabled()) {
log.debug(buildMessage("entity [" + entityname + "] is inherited and super class ["
+ superClass + "] has compass mapping, filtering it out"));
}
continue;
}
}
if (isFilteredForIndex(entityname)) {
if (log.isDebugEnabled()) {
log.debug(buildMessage("entity [" + entityname + "] is marked to be filtered, filtering it out"));
}
continue;
}
if (compassGps.hasMappingForEntityForIndex((entityname))) {
ResourceMapping resourceMapping = compassGps.getMappingForEntityForIndex(entityname);
HibernateEntityInfo info = new HibernateEntityInfo(entityname, "from " + entityname,
resourceMapping.getSubIndexHash().getSubIndexes());
infos.add(info);
if (log.isDebugEnabled()) {
log.debug(buildMessage("entity [" + entityname + "] will be indexed"));
}
} else {
if (log.isDebugEnabled()) {
log.debug(buildMessage("entity [" + entityname + "] does not have compass mapping, filtering it out"));
}
}
}
} catch (Exception e) {
throw new HibernateGpsDeviceException(buildMessage("Failed to fetch all class meta data"), e);
}
return (HibernateEntityInfo[]) infos.toArray(new HibernateEntityInfo[infos.size()]);
}
protected List doGetObjects(HibernateEntityInfo info, int from, int count, HibernateSessionWrapper sessionWrapper)
throws HibernateGpsDeviceException {
List values;
Session session = ((Hibernate3SessionWrapper) sessionWrapper).getSession();
try {
Query query = doGetQuery(info, session).setFirstResult(from).setMaxResults(count);
values = query.list();
} catch (Exception e) {
throw new HibernateGpsDeviceException(buildMessage("Failed to open session to fetch data for class ["
+ info.getName() + "]"), e);
}
return values;
}
/**
* Can be used to override query creation for a certain hibernate entity info.
*/
protected Query doGetQuery(HibernateEntityInfo info, Session session) {
return session.createQuery(info.getSelectQuery());
}
private void registerEventsForHibernate30(SessionFactory sessionFactory) {
try {
Class sessionEventListenerConfigClass = ClassUtils.forName("org.hibernate.event.SessionEventListenerConfig", compassGps.getMirrorCompass().getSettings().getClassLoader());
FieldInvoker sessionFactorySessionEventListenerConfig =
new FieldInvoker(SessionFactoryImpl.class, "sessionEventListenerConfig").prepare();
Object sessionEventListenerConfig = sessionFactorySessionEventListenerConfig.get(sessionFactory);
FieldInvoker eventListener = new FieldInvoker(sessionEventListenerConfigClass, "postInsertEventListener").prepare();
eventListener.set(sessionEventListenerConfig,
new Hibernate3GpsDevicePostInsert((PostInsertEventListener) eventListener.get(sessionEventListenerConfig), mirrorFilter));
eventListener = new FieldInvoker(sessionEventListenerConfigClass, "postUpdateEventListener").prepare();
eventListener.set(sessionEventListenerConfig,
new Hibernate3GpsDevicePostUpdate((PostUpdateEventListener) eventListener.get(sessionEventListenerConfig), mirrorFilter));
eventListener = new FieldInvoker(sessionEventListenerConfigClass, "postDeleteEventListener").prepare();
eventListener.set(sessionEventListenerConfig,
new Hibernate3GpsDevicePostDelete((PostDeleteEventListener) eventListener.get(sessionEventListenerConfig), mirrorFilter));
} catch (Exception e) {
throw new HibernateGpsDeviceException(
buildMessage("Failed to inject compass gps device events into hibernate 3.0 session factory [" +
sessionFactory.getClass().getName() + "]"), e);
}
}
private void unregisterEventsForHibernate30(SessionFactory sessionFactory) {
try {
Class sessionEventListenerConfigClass = ClassUtils.forName("org.hibernate.event.SessionEventListenerConfig", compassGps.getMirrorCompass().getSettings().getClassLoader());
FieldInvoker sessionFactorySessionEventListenerConfig =
new FieldInvoker(SessionFactoryImpl.class, "sessionEventListenerConfig").prepare();
Object sessionEventListenerConfig = sessionFactorySessionEventListenerConfig.get(sessionFactory);
FieldInvoker eventListener = new FieldInvoker(sessionEventListenerConfigClass, "postInsertEventListener").prepare();
PostInsertEventListener postInsertEventListener = (PostInsertEventListener) eventListener.get(sessionEventListenerConfig);
if (postInsertEventListener instanceof Hibernate3GpsDevicePostInsert) {
eventListener.set(sessionEventListenerConfig, ((Hibernate3GpsDevicePostInsert) postInsertEventListener).getPostInsertEventListener());
}
eventListener = new FieldInvoker(sessionEventListenerConfigClass, "postUpdateEventListener").prepare();
PostUpdateEventListener postUpdateEventListener = (PostUpdateEventListener) eventListener.get(sessionEventListenerConfig);
if (postUpdateEventListener instanceof Hibernate3GpsDevicePostUpdate) {
eventListener.set(sessionEventListenerConfig, ((Hibernate3GpsDevicePostUpdate) postUpdateEventListener).getPostUpdateEventListener());
}
eventListener = new FieldInvoker(sessionEventListenerConfigClass, "postDeleteEventListener").prepare();
PostDeleteEventListener postDeleteEventListener = (PostDeleteEventListener) eventListener.get(sessionEventListenerConfig);
if (postDeleteEventListener instanceof Hibernate3GpsDevicePostDelete) {
eventListener.set(sessionEventListenerConfig, ((Hibernate3GpsDevicePostDelete) postDeleteEventListener).getPostDeleteEventListener());
}
} catch (Exception e) {
throw new HibernateGpsDeviceException(
buildMessage("Failed to inject compass gps device events into hibernate 3.0 session factory [" +
sessionFactory.getClass().getName() + "]"), e);
}
}
private void registerEventsForHibernate31(SessionFactory sessionFactory) {
try {
Class eventListenersClass = ClassUtils.forName("org.hibernate.event.EventListeners", compassGps.getMirrorCompass().getSettings().getClassLoader());
Object eventListeners =
new FieldInvoker(SessionFactoryImpl.class, "eventListeners").prepare().get(sessionFactory);
FieldInvoker eventListener = new FieldInvoker(eventListenersClass, "postInsertEventListeners").prepare();
PostInsertEventListener[] postInsertEventListener = (PostInsertEventListener[]) eventListener.get(eventListeners);
PostInsertEventListener[] tempPostInsertEventListener = new PostInsertEventListener[postInsertEventListener.length + 1];
System.arraycopy(postInsertEventListener, 0, tempPostInsertEventListener, 0, postInsertEventListener.length);
tempPostInsertEventListener[postInsertEventListener.length] = new Hibernate3GpsDevicePostInsert(null, mirrorFilter);
eventListener.set(eventListeners, tempPostInsertEventListener);
eventListener = new FieldInvoker(eventListenersClass, "postUpdateEventListeners").prepare();
PostUpdateEventListener[] postUpdateEventListener = (PostUpdateEventListener[]) eventListener.get(eventListeners);
PostUpdateEventListener[] tempPostUpdateEventListener = new PostUpdateEventListener[postUpdateEventListener.length + 1];
System.arraycopy(postUpdateEventListener, 0, tempPostUpdateEventListener, 0, postUpdateEventListener.length);
tempPostUpdateEventListener[postUpdateEventListener.length] = new Hibernate3GpsDevicePostUpdate(null, mirrorFilter);
eventListener.set(eventListeners, tempPostUpdateEventListener);
eventListener = new FieldInvoker(eventListenersClass, "postDeleteEventListeners").prepare();
PostDeleteEventListener[] postDeleteEventListener = (PostDeleteEventListener[]) eventListener.get(eventListeners);
PostDeleteEventListener[] tempPostDeleteEventListener = new PostDeleteEventListener[postDeleteEventListener.length + 1];
System.arraycopy(postDeleteEventListener, 0, tempPostDeleteEventListener, 0, postDeleteEventListener.length);
tempPostDeleteEventListener[postDeleteEventListener.length] = new Hibernate3GpsDevicePostDelete(null, mirrorFilter);
eventListener.set(eventListeners, tempPostDeleteEventListener);
} catch (Exception e) {
throw new HibernateGpsDeviceException(
buildMessage("Failed to inject compass gps device events into hibernate 3.1 session factory [" +
sessionFactory.getClass().getName() + "]"), e);
}
}
private void unregisterEventsForHibernate31(SessionFactory sessionFactory) {
try {
Class eventListenersClass = ClassUtils.forName("org.hibernate.event.EventListeners", compassGps.getMirrorCompass().getSettings().getClassLoader());
Object eventListeners =
new FieldInvoker(SessionFactoryImpl.class, "eventListeners").prepare().get(sessionFactory);
FieldInvoker eventListener = new FieldInvoker(eventListenersClass, "postInsertEventListeners").prepare();
PostInsertEventListener[] postInsertEventListener = (PostInsertEventListener[]) eventListener.get(eventListeners);
ArrayList tempPostInsertEventListener = new ArrayList();
for (int i = 0; i < postInsertEventListener.length; i++) {
if (!(postInsertEventListener[i] instanceof Hibernate3GpsDevicePostInsert)) {
tempPostInsertEventListener.add(postInsertEventListener[i]);
}
}
eventListener.set(eventListeners, tempPostInsertEventListener.toArray(new PostInsertEventListener[tempPostInsertEventListener.size()]));
eventListener = new FieldInvoker(eventListenersClass, "postUpdateEventListeners").prepare();
PostUpdateEventListener[] postUpdateEventListener = (PostUpdateEventListener[]) eventListener.get(eventListeners);
ArrayList tempPostUpdateEventListener = new ArrayList();
for (int i = 0; i < postUpdateEventListener.length; i++) {
if (!(postUpdateEventListener[i] instanceof Hibernate3GpsDevicePostUpdate)) {
tempPostUpdateEventListener.add(postUpdateEventListener[i]);
}
}
eventListener.set(eventListeners, tempPostUpdateEventListener.toArray(new PostUpdateEventListener[tempPostUpdateEventListener.size()]));
eventListener = new FieldInvoker(eventListenersClass, "postDeleteEventListeners").prepare();
PostDeleteEventListener[] postDeleteEventListener = (PostDeleteEventListener[]) eventListener.get(eventListeners);
ArrayList tempPostDeleteEventListener = new ArrayList();
for (int i = 0; i < postDeleteEventListener.length; i++) {
if (!(postDeleteEventListener[i] instanceof Hibernate3GpsDevicePostDelete)) {
tempPostDeleteEventListener.add(postDeleteEventListener[i]);
}
}
eventListener.set(eventListeners, tempPostDeleteEventListener.toArray(new PostDeleteEventListener[tempPostDeleteEventListener.size()]));
} catch (Exception e) {
throw new HibernateGpsDeviceException(
buildMessage("Failed to inject compass gps device events into hibernate 3.1 session factory [" +
sessionFactory.getClass().getName() + "]"), e);
}
}
protected boolean isInherited(ClassMetadata classMetadata) throws HibernateGpsDeviceException {
try {
// just try and invoke the Hibernate 3.2 support for this one
return classMetadata.isInherited();
} catch (Throwable t) {
// do nothing
}
try {
ClassUtils.forName("org.hibernate.event.SessionEventListenerConfig", compassGps.getMirrorCompass().getSettings().getClassLoader());
return isInherited30(classMetadata);
} catch (ClassNotFoundException e) {
return isInherited31(classMetadata);
}
}
private boolean isInherited30(ClassMetadata classMetadata) throws HibernateGpsDeviceException {
try {
Class basicEntityPersisterClass = ClassUtils.forName("org.hibernate.persister.entity.BasicEntityPersister", compassGps.getMirrorCompass().getSettings().getClassLoader());
Object entityMetamodel =
new FieldInvoker(basicEntityPersisterClass, "entityMetamodel").prepare().get(classMetadata);
MethodInvoker isInheritedMethodInvoker = new MethodInvoker();
isInheritedMethodInvoker.setTargetObject(entityMetamodel);
isInheritedMethodInvoker.setTargetMethod("isInherited");
Boolean isInherited = (Boolean) isInheritedMethodInvoker.prepare().invoke();
return isInherited.booleanValue();
} catch (Exception e) {
throw new HibernateGpsDeviceException(
buildMessage("Failed to check for inheritence for 3.0"), e);
}
}
private boolean isInherited31(ClassMetadata classMetadata) throws HibernateGpsDeviceException {
try {
Class abstractEntityPersisterClass = ClassUtils.forName("org.hibernate.persister.entity.AbstractEntityPersister", compassGps.getMirrorCompass().getSettings().getClassLoader());
Object entityMetamodel =
new FieldInvoker(abstractEntityPersisterClass, "entityMetamodel").prepare().get(classMetadata);
MethodInvoker isInheritedMethodInvoker = new MethodInvoker();
isInheritedMethodInvoker.setTargetObject(entityMetamodel);
isInheritedMethodInvoker.setTargetMethod("isInherited");
Boolean isInherited = (Boolean) isInheritedMethodInvoker.prepare().invoke();
return isInherited.booleanValue();
} catch (Exception e) {
throw new HibernateGpsDeviceException(
buildMessage("Failed to check for inheritence for 3.1"), e);
}
}
}