All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jdon.container.annotation.AnnotationContainerBuilder Maven / Gradle / Ivy

package com.jdon.container.annotation;

import java.util.List;
import java.util.Map;

import org.aopalliance.intercept.MethodInterceptor;

import com.jdon.annotation.Interceptor;
import com.jdon.aop.interceptor.InterceptorsChain;
import com.jdon.aop.joinpoint.Pointcut;
import com.jdon.container.ContainerWrapper;
import com.jdon.container.builder.DefaultContainerBuilder;
import com.jdon.container.config.ContainerComponents;
import com.jdon.container.finder.ComponentKeys;
import com.jdon.container.interceptor.IntroduceInfoHolder;
import com.jdon.controller.context.AppContextWrapper;
import com.jdon.util.Debug;
import com.jdon.util.UtilValidate;

public class AnnotationContainerBuilder extends DefaultContainerBuilder {
	public final static String module = AnnotationContainerBuilder.class.getName();
	private AnnotationContainerRegistry annotationContainerRegistry;
	private AppContextWrapper context;

	public AnnotationContainerBuilder(AppContextWrapper context, ContainerWrapper containerWrapper, ContainerComponents basicComponents,
			ContainerComponents aspectConfigComponents, ContainerLoaderAnnotation containerLoaderAnnotation) {
		super(containerWrapper, basicComponents, aspectConfigComponents);
		this.context = context;
		this.annotationContainerRegistry = new AnnotationContainerRegistry(context, containerWrapper, containerLoaderAnnotation);
	}

	public void registerAspectComponents() throws Exception {
		super.registerAspectComponents();
		registerAnnotationAspectComponents();

		InterceptorsChain existedInterceptorsChain = (InterceptorsChain) containerWrapper.lookup(ComponentKeys.INTERCEPTOR_CHAIN);
		// existedInterceptorsChain.getAdvisors(pointcut)
		IntroduceInfoHolder ih = annotationContainerRegistry.getContainerLoaderAnnotation().getConfigInfo().getIntroduceInfoHolder();
		for (String adviceName : ih.getIntroduceNames()) {
			// there is a class(target) use annotation @Introduce("advicename")
			List targetNames = ih.getIntroducerNameByIntroducedName(adviceName);
			for (String targetName : targetNames) {
				// if the advicename has been register by its pointcut is all
				// pojoServices, change its pointcut to this target class
				if (existedInterceptorsChain.findInterceptorFromChainByName(Pointcut.DOMAIN, adviceName)) {
					existedInterceptorsChain.addInterceptor(targetName, adviceName);
				}
			}
		}
	}

	public void registerAnnotationAspectComponents() throws Exception {
		try {
			InterceptorsChain existedInterceptorsChain = (InterceptorsChain) containerWrapper.lookup(ComponentKeys.INTERCEPTOR_CHAIN);
			AnnotationHolder annotationHolder = annotationContainerRegistry.getContainerLoaderAnnotation().loadAnnotationHolder(context,
					containerWrapper);
			Map inters = annotationHolder.getInterceptors();
			for (String name : inters.keySet()) {
				Class classz = inters.get(name);
				if (!(MethodInterceptor.class.isAssignableFrom(classz))) {
					Debug.logError(" your @Interceptor class not implements MethodInteceptor! class=" + classz.getName(), module);
					continue;
				}
				Interceptor inter = (Interceptor) classz.getAnnotation(Interceptor.class);
				if (!UtilValidate.isEmpty(inter.pointcut())) {
					String[] targets = inter.pointcut().split(",");
					for (int i = 0; i < targets.length; i++) {
						// add interceptor instance into InterceptorsChain
						// object
						existedInterceptorsChain.addInterceptor(targets[i], name);
					}
				} else {
					IntroduceInfoHolder ih = annotationContainerRegistry.getContainerLoaderAnnotation().getConfigInfo().getIntroduceInfoHolder();
					List targetNames = ih.getIntroducerNameByIntroducedName(name);
					for (String targetName : targetNames) {
						existedInterceptorsChain.addInterceptor(targetName, name);

					}
					if (targetNames.size() == 0)
						existedInterceptorsChain.addInterceptor(Pointcut.POJO_TARGET_PROPS_SERVICES, name);
				}
			}
		} catch (Exception e) {
			Debug.logError("[JdonFramework] registerAspectComponents" + e, module);
		}
	}

	public void registerUserService() throws Exception {
		super.registerUserService();
		annotationContainerRegistry.registerAnnotationComponents();
	}

	public void doAfterStarted() throws Exception {
		annotationContainerRegistry.copyTargetMetaDefHolder();
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy