Package com.rop.impl

Source Code of com.rop.impl.AnnotationServletServiceRouterFactoryBean

/**
* 版权声明: 版权所有 违者必究 2012
* 日    期:12-6-7
*/
package com.rop.impl;

import com.rop.Interceptor;
import com.rop.RopException;
import com.rop.ThreadFerry;
import com.rop.config.InterceptorHolder;
import com.rop.config.RopEventListenerHodler;
import com.rop.event.RopEventListener;
import com.rop.security.*;
import com.rop.session.SessionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;

import java.util.*;
import java.util.concurrent.ThreadPoolExecutor;

/**
* <pre>
* 功能说明:
* </pre>
*
* @author 陈雄华
* @version 1.0
*/
public class AnnotationServletServiceRouterFactoryBean
        implements FactoryBean<AnnotationServletServiceRouter>,ApplicationContextAware, InitializingBean, DisposableBean{

    private static final String ALL_FILE_TYPES = "*";

    protected final Logger logger = LoggerFactory.getLogger(getClass());

    private ApplicationContext applicationContext;

    private ThreadPoolExecutor threadPoolExecutor;

    private SessionManager sessionManager;

    private AppSecretManager appSecretManager;

    private ServiceAccessController serviceAccessController;

    private InvokeTimesController invokeTimesController;

    private boolean signEnable = true;

    private String extErrorBasename;

    private String[] extErrorBasenames;

    private int serviceTimeoutSeconds = -1;

    private Class<? extends ThreadFerry> threadFerryClass = DumbThreadFerry.class;

    private FormattingConversionService formattingConversionService;

    private AnnotationServletServiceRouter serviceRouter;

    //多值用逗号分隔,默认支持4种格式的文件
    private String uploadFileTypes = ALL_FILE_TYPES;

    //单位为K,默认为10M
    private int uploadFileMaxSize = 10 * 1024;


    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }



    public void destroy() throws Exception {
        serviceRouter.shutdown();
    }


    public Class<?> getObjectType() {
        return AnnotationServletServiceRouter.class;
    }


    public AnnotationServletServiceRouter getObject() throws Exception {
        return this.serviceRouter;
    }


    public boolean isSingleton() {
        return true;
    }

    public void setInvokeTimesController(InvokeTimesController invokeTimesController) {
        this.invokeTimesController = invokeTimesController;
    }

    public void setThreadFerryClass(Class<? extends ThreadFerry> threadFerryClass) {
        this.threadFerryClass = threadFerryClass;
    }

    public void setThreadFerryClassName(String threadFerryClassName) {
        try {
            if (StringUtils.hasText(threadFerryClassName)) {
                Class<?> threadFerryClass =
                        ClassUtils.forName(threadFerryClassName, getClass().getClassLoader());
                if (!ClassUtils.isAssignable(ThreadFerry.class, threadFerryClass)) {
                    throw new RopException(threadFerryClassName + "没有实现"
                                         + ThreadFerry.class.getName() + "接口");
                }
                this.threadFerryClass = (Class<? extends ThreadFerry>)threadFerryClass;
            }
        } catch (ClassNotFoundException e) {
            throw new IllegalArgumentException(e);
        }
    }


    public void afterPropertiesSet() throws Exception {
        //实例化一个AnnotationServletServiceRouter
        serviceRouter = new AnnotationServletServiceRouter();

        //设置国际化错误资源
        if (extErrorBasename != null) {
            serviceRouter.setExtErrorBasename(extErrorBasename);
        }

        if (extErrorBasenames != null) {
            serviceRouter.setExtErrorBasenames(extErrorBasenames);
        }

        DefaultSecurityManager securityManager = BeanUtils.instantiate(DefaultSecurityManager.class);

        securityManager.setSessionManager(sessionManager);
        securityManager.setAppSecretManager(appSecretManager);
        securityManager.setServiceAccessController(serviceAccessController);
        securityManager.setInvokeTimesController(invokeTimesController);
        securityManager.setFileUploadController(buildFileUploadController());

        serviceRouter.setSecurityManager(securityManager);
        serviceRouter.setThreadPoolExecutor(threadPoolExecutor);
        serviceRouter.setSignEnable(signEnable);
        serviceRouter.setServiceTimeoutSeconds(serviceTimeoutSeconds);
        serviceRouter.setFormattingConversionService(formattingConversionService);
        serviceRouter.setSessionManager(sessionManager);
        serviceRouter.setThreadFerryClass(threadFerryClass);
        serviceRouter.setInvokeTimesController(invokeTimesController);

        //注册拦截器
        ArrayList<Interceptor> interceptors = getInterceptors();
        if (interceptors != null) {
            for (Interceptor interceptor : interceptors) {
                serviceRouter.addInterceptor(interceptor);
            }
            if (logger.isInfoEnabled()) {
                logger.info("register total {} interceptors",interceptors.size());
            }
        }

        //注册监听器
        ArrayList<RopEventListener> listeners = getListeners();
        if (listeners != null) {
            for (RopEventListener listener : listeners) {
                serviceRouter.addListener(listener);
            }
            if (logger.isInfoEnabled()) {
                logger.info("register total {} listeners",listeners.size());
            }
        }

        //设置Spring上下文信息
        serviceRouter.setApplicationContext(this.applicationContext);

        //启动之
        serviceRouter.startup();
    }

    private DefaultFileUploadController buildFileUploadController() {
        Assert.notNull(this.uploadFileTypes, "Please set the updateFileTypes,if all,set *");
        if(ALL_FILE_TYPES.equals(uploadFileTypes.trim())){
            return new DefaultFileUploadController(this.uploadFileMaxSize);
        }else {
            String[] items = this.uploadFileTypes.split(",");
            List<String> fileTypes = Arrays.asList(items);
            return new DefaultFileUploadController(fileTypes, this.uploadFileMaxSize);
        }
    }

    private ArrayList<Interceptor> getInterceptors() {
        Map<String, InterceptorHolder> interceptorMap = this.applicationContext.getBeansOfType(InterceptorHolder.class);
        if (interceptorMap != null && interceptorMap.size() > 0) {
            ArrayList<Interceptor> interceptors = new ArrayList<Interceptor>(interceptorMap.size());

            //从Spring容器中获取Interceptor
            for (InterceptorHolder interceptorHolder : interceptorMap.values()) {
                interceptors.add(interceptorHolder.getInterceptor());
            }

            //根据getOrder()值排序
            Collections.sort(interceptors, new Comparator<Interceptor>() {
                public int compare(Interceptor o1, Interceptor o2) {
                    if (o1.getOrder() > o2.getOrder()) {
                        return 1;
                    } else if (o1.getOrder() < o2.getOrder()) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            });
            return interceptors;
        } else {
            return null;
        }
    }

    private ArrayList<RopEventListener> getListeners() {
        Map<String, RopEventListenerHodler> listenerMap = this.applicationContext.getBeansOfType(RopEventListenerHodler.class);
        if (listenerMap != null && listenerMap.size() > 0) {
            ArrayList<RopEventListener> ropEventListeners = new ArrayList<RopEventListener>(listenerMap.size());

            //从Spring容器中获取Interceptor
            for (RopEventListenerHodler listenerHolder : listenerMap.values()) {
                ropEventListeners.add(listenerHolder.getRopEventListener());
            }
            return ropEventListeners;
        } else {
            return null;
        }
    }

    public void setFormattingConversionService(FormattingConversionService formattingConversionService) {
        this.formattingConversionService = formattingConversionService;
    }

    public void setThreadPoolExecutor(ThreadPoolExecutor threadPoolExecutor) {
        this.threadPoolExecutor = threadPoolExecutor;
    }

    public void setSignEnable(boolean signEnable) {
        this.signEnable = signEnable;
    }

    public void setExtErrorBasename(String extErrorBasename) {
        this.extErrorBasename = extErrorBasename;
    }

    public void setExtErrorBasenames(String[] extErrorBasenames) {
        this.extErrorBasenames = extErrorBasenames;
    }

    public void setServiceTimeoutSeconds(int serviceTimeoutSeconds) {
        this.serviceTimeoutSeconds = serviceTimeoutSeconds;
    }

    public void setSessionManager(SessionManager sessionManager) {
        this.sessionManager = sessionManager;
    }

    public void setAppSecretManager(AppSecretManager appSecretManager) {
        this.appSecretManager = appSecretManager;
    }

    public void setServiceAccessController(ServiceAccessController serviceAccessController) {
        this.serviceAccessController = serviceAccessController;
    }

    public String getUploadFileTypes() {
        return uploadFileTypes;
    }

    public void setUploadFileTypes(String uploadFileTypes) {
        this.uploadFileTypes = uploadFileTypes;
    }

    public int getUploadFileMaxSize() {
        return uploadFileMaxSize;
    }

    public void setUploadFileMaxSize(int uploadFileMaxSize) {
        this.uploadFileMaxSize = uploadFileMaxSize;
    }
}
TOP

Related Classes of com.rop.impl.AnnotationServletServiceRouterFactoryBean

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.