package org.om.core.impl.persistence.cglib;
import javax.inject.Inject;
import net.sf.cglib.proxy.Enhancer;
import org.om.core.api.mapping.EntityMapping;
import org.om.core.api.persistence.PersistenceAdapter;
import org.om.core.api.persistence.interceptor.PersistenceInterceptor;
import org.om.core.api.persistence.interceptor.factory.PersistenceInterceptorFactory;
import org.om.core.api.persistence.proxy.ProxyFactory;
import org.om.core.api.session.Session;
/**
* @author Jakob Külzer
*/
public class CglibProxyFactory implements ProxyFactory {
private final PersistenceInterceptorFactory interceptorFactory;
@Inject
public CglibProxyFactory(PersistenceInterceptorFactory interceptorFactory) {
this.interceptorFactory = interceptorFactory;
}
public Object create(Session session, EntityMapping entityMapping, PersistenceAdapter persistenceDelegate) {
final PersistenceInterceptor persistenceInterceptor = interceptorFactory.create(session, persistenceDelegate);
final CglibPersistenceInterceptor methodInterceptor = new CglibPersistenceInterceptor(entityMapping, persistenceInterceptor);
try {
return Enhancer.create(entityMapping.getTypeClass(), methodInterceptor);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
}