allow multiple ways to intercept

This commit is contained in:
Alex Huang 2011-01-06 15:25:56 -08:00
parent e496a99c1c
commit 4b360258ee
3 changed files with 24 additions and 15 deletions

View File

@ -58,10 +58,10 @@ public class DataCenterDaoImpl extends GenericDaoBase<DataCenterVO, Long> implem
protected SearchBuilder<DataCenterVO> PublicZonesSearch;
protected SearchBuilder<DataCenterVO> ChildZonesSearch;
protected static final DataCenterIpAddressDaoImpl _ipAllocDao = ComponentLocator.inject(DataCenterIpAddressDaoImpl.class);
protected static final DataCenterLinkLocalIpAddressDaoImpl _LinkLocalIpAllocDao = ComponentLocator.inject(DataCenterLinkLocalIpAddressDaoImpl.class);
protected static final DataCenterVnetDaoImpl _vnetAllocDao = ComponentLocator.inject(DataCenterVnetDaoImpl.class);
protected static final PodVlanDaoImpl _podVlanAllocDao = ComponentLocator.inject(PodVlanDaoImpl.class);
protected final DataCenterIpAddressDaoImpl _ipAllocDao = ComponentLocator.inject(DataCenterIpAddressDaoImpl.class);
protected final DataCenterLinkLocalIpAddressDaoImpl _LinkLocalIpAllocDao = ComponentLocator.inject(DataCenterLinkLocalIpAddressDaoImpl.class);
protected final DataCenterVnetDaoImpl _vnetAllocDao = ComponentLocator.inject(DataCenterVnetDaoImpl.class);
protected final PodVlanDaoImpl _podVlanAllocDao = ComponentLocator.inject(PodVlanDaoImpl.class);
protected long _prefix;
protected Random _rand = new Random(System.currentTimeMillis());
protected TableGenerator _tgMacAddress;

View File

@ -62,6 +62,8 @@ import org.xml.sax.helpers.DefaultHandler;
import com.cloud.utils.Pair;
import com.cloud.utils.PropertiesUtil;
import com.cloud.utils.db.DatabaseCallback;
import com.cloud.utils.db.DatabaseCallbackFilter;
import com.cloud.utils.db.GenericDao;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.mgmt.JmxUtil;
@ -82,8 +84,8 @@ public class ComponentLocator implements ComponentLocatorMBean {
protected static final HashMap<String, ComponentLocator> s_locators = new HashMap<String, ComponentLocator>();
protected static final HashMap<Class<?>, InjectInfo> s_factories = new HashMap<Class<?>, InjectInfo>();
protected static Boolean s_once = false;
protected static Callback[] s_callbacks;
protected static CallbackFilter s_callbackFilter;
protected static Callback[] s_callbacks = new Callback[] { NoOp.INSTANCE, new DatabaseCallback()};
protected static CallbackFilter s_callbackFilter = new DatabaseCallbackFilter();
protected static final List<AnnotationInterceptor<?>> s_interceptors = new ArrayList<AnnotationInterceptor<?>>();
protected HashMap<String, Adapters<? extends Adapter>> _adapterMap;
@ -189,14 +191,16 @@ public class ComponentLocator implements ComponentLocatorMBean {
}
synchronized(s_interceptors) {
s_callbacks = new Callback[s_interceptors.size() + 2];
int i = 0;
s_callbacks[i++] = NoOp.INSTANCE;
s_callbacks[i++] = new InterceptorDispatcher();
for (AnnotationInterceptor<?> interceptor : s_interceptors) {
s_callbacks[i++] = interceptor.getCallback();
if (s_interceptors.size() > 0) {
s_callbacks = new Callback[s_interceptors.size() + 2];
int i = 0;
s_callbacks[i++] = NoOp.INSTANCE;
s_callbacks[i++] = new InterceptorDispatcher();
for (AnnotationInterceptor<?> interceptor : s_interceptors) {
s_callbacks[i++] = interceptor.getCallback();
}
s_callbackFilter = new InterceptorFilter();
}
s_callbackFilter = new InterceptorFilter();
}
XmlHandler handler = result.first();

View File

@ -40,12 +40,17 @@ public class DatabaseCallback implements MethodInterceptor, AnnotationIntercepto
@Override
public boolean needToIntercept(AnnotatedElement element) {
DB db = element.getAnnotation(DB.class);
if (!(element instanceof Method)) {
return false;
}
Method method = (Method)element;
DB db = method.getAnnotation(DB.class);
if (db != null) {
return db.txn();
}
Class<?> clazz = element.getClass().getDeclaringClass();
Class<?> clazz = method.getDeclaringClass();
do {
db = clazz.getAnnotation(DB.class);
if (db != null) {