protected void attachMetaData(Advisor advisor, Class<?> clazz) { synchronized (classMetaData) { for (ClassMetaDataBinding data : classMetaData.values()) { addAdvisorToClassMetaDataBinding(data, clazz, advisor, clazz); } } }
protected void addAdvisorToClassMetaDataBinding(ClassMetaDataBinding meta, Class<?> clazz, Advisor advisor, Class<?> advisedClass) { if (meta.matches(advisor, clazz)) { meta.addAdvisor(advisor); } else if (advisor.chainOverridingForInheritedMethods()) { //If advisor class does not match class metadata directly, try the superclasses so that methods can inherit //old skool weaving doesn't support metadata overriding for inherited methods, so only do this extra work for generated advisors Class<?> superClass = clazz.getSuperclass(); if (superClass != null && superClass != Object.class) { addAdvisorToClassMetaDataBinding(meta, superClass, advisor, advisedClass); } } }
protected void updateAdvisorsForAddedClassMetaData(ClassMetaDataBinding meta) { synchronized (advisors) { Iterator<Class<?>> it = advisors.keySet().iterator(); while (it.hasNext()) { Advisor advisor = getAdvisorFromAdvisorsKeySetIterator(it); if (advisor == null) continue; Class<?> clazz = advisor.getClazz(); addAdvisorToClassMetaDataBinding(meta, clazz, advisor, clazz); } } synchronized (subscribedSubDomains) { copySubDomainsFromQueue(true); boolean newSubscribers = true; while (newSubscribers) { if (subscribedSubDomains.size() > 0) { for (Domain domain : subscribedSubDomains.keySet()) { domain.updateAdvisorsForAddedClassMetaData(meta); } } newSubscribers = copySubDomainsFromQueue(false); } } }