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

org.tinygroup.tinyrunner.extended.ExtendedRunner Maven / Gradle / Ivy

/**
 * Copyright (c) 2012-2016, www.tinygroup.org ([email protected]).
 *
 *  Licensed under the GPL, Version 3.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *       http://www.gnu.org/licenses/gpl.html
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.tinygroup.tinyrunner.extended;

import org.springframework.context.ApplicationContext;
import org.tinygroup.application.Application;
import org.tinygroup.application.ApplicationProcessor;
import org.tinygroup.application.impl.ApplicationDefault;
import org.tinygroup.beancontainer.BeanContainerFactory;
import org.tinygroup.commons.io.StreamUtil;
import org.tinygroup.config.ConfigurationManager;
import org.tinygroup.config.util.ConfigurationUtil;
import org.tinygroup.fileresolver.FileResolver;
import org.tinygroup.fileresolver.FileResolverFactory;
import org.tinygroup.fileresolver.FileResolverUtil;
import org.tinygroup.fileresolver.impl.ConfigurationFileProcessor;
import org.tinygroup.fileresolver.impl.LocalPropertiesFileProcessor;
import org.tinygroup.fileresolver.impl.MergePropertiesFileProcessor;
import org.tinygroup.logger.Logger;
import org.tinygroup.logger.LoggerFactory;
import org.tinygroup.parser.filter.PathFilter;
import org.tinygroup.remoteconfig.RemoteConfigReadClient;
import org.tinygroup.remoteconfig.utils.RemoteConfigHandler;
import org.tinygroup.springutil.SpringBeanContainer;
import org.tinygroup.springutil.fileresolver.SpringBeansFileProcessor;
import org.tinygroup.xmlparser.node.XmlNode;
import org.tinygroup.xmlparser.parser.XmlStringParser;

import java.io.InputStream;
import java.util.List;

public class ExtendedRunner {

    private static final Logger LOGGER = LoggerFactory
            .getLogger(ExtendedRunner.class);
    private static final String TINY_JAR_PATTERN = "org\\.tinygroup\\.(.)*\\.jar";
    // "/Application.preloadbeans.xml";
    private static boolean init = false;
    private static Application application;
    private static String DEFAULT_CONFIG = "application.xml";
    private static ApplicationContext parentContainer;

    private static RemoteConfigReadClient remoteConfigReadClient;

    public static void setRemoteConfigReadClient(
            RemoteConfigReadClient remoteConfigReadClient) {
        ExtendedRunner.remoteConfigReadClient = remoteConfigReadClient;
    }

    public static void init(ApplicationContext parentContainer, String xmlFile, List includePathPatterns) {
        if (init) {
            return;
        }
        setContainer(parentContainer);
        initDirect(xmlFile, includePathPatterns);
    }

    public static void setContainer(ApplicationContext container) {
        parentContainer = container;
    }

    /**
     * 初始化
     *
     * @param classPathResolve 是否对classPath进行处理
     */
    public static void initDirect(String xmlFile, List includePathPatterns) {

        // init(xmlFile, classPathResolve, null, null);
        String configXml = xmlFile;
        if (null == configXml || "".equals(configXml)) {
            configXml = DEFAULT_CONFIG;
        }
        InputStream inputStream = ExtendedRunner.class.getClassLoader()
                .getResourceAsStream(configXml);
        if (inputStream == null) {
            inputStream = ExtendedRunner.class.getResourceAsStream(configXml);
        }
        String applicationConfig = "";
        if (inputStream != null) {
            try {
                applicationConfig = StreamUtil.readText(inputStream, "UTF-8",
                        false);
                application = new ApplicationDefault();
                if (applicationConfig != null) {
                    ConfigurationManager c = ConfigurationUtil
                            .getConfigurationManager();
                    XmlNode applicationXml = new XmlStringParser().parse(applicationConfig).getRoot();
                    c.setApplicationConfiguration(applicationXml);

                }
                initSpring(applicationConfig, includePathPatterns);

                FileResolver fileResolver = BeanContainerFactory
                        .getBeanContainer(
                                ExtendedRunner.class.getClassLoader())
                        .getBean(FileResolver.BEAN_NAME);
                FileResolverUtil.addClassPathPattern(fileResolver);
                fileResolver.addResolvePath(FileResolverUtil
                        .getClassPath(fileResolver));
                fileResolver.addResolvePath(FileResolverUtil.getWebClasses());
                try {
                    fileResolver.addResolvePath(FileResolverUtil
                            .getWebLibJars(fileResolver));
                } catch (Exception e) {
                    LOGGER.errorMessage("为文件扫描器添加webLibJars时出现异常", e);
                }
                fileResolver.addIncludePathPattern(TINY_JAR_PATTERN);
                addIncludePathPatterns(fileResolver, includePathPatterns);
                XmlNode applicationXml = ConfigurationUtil
                        .getConfigurationManager()
                        .getApplicationConfiguration();
                if (applicationXml != null) {
                    List processorConfigs = applicationXml
                            .getSubNodesRecursively("application-processor");
                    if (processorConfigs != null) {
                        for (XmlNode processorConfig : processorConfigs) {
                            String processorBean = processorConfig
                                    .getAttribute("bean");
                            ApplicationProcessor processor = BeanContainerFactory
                                    .getBeanContainer(
                                            ExtendedRunner.class
                                                    .getClassLoader()).getBean(
                                            processorBean);// TODO
                            application.addApplicationProcessor(processor);
                        }
                    }
                }
            } catch (Exception e) {
                LOGGER.errorMessage("载入应用配置信息时出现异常,错误原因:{}!", e, e.getMessage());
                throw new RuntimeException(e);
            }
        }

        application.init();
        application.start();
        init = true;
    }

    private static void initSpring(String applicationConfig, List includePathPatterns) {
//    	if(parentContainer==null){
//    		BeanContainerFactory.initBeanContainer(SpringBeanContainer.class.getName());
//    	}else{
        BeanContainerFactory.initBeanContainer(SpringBeanContainer.class, parentContainer);
//    	}

        FileResolver fileResolver = FileResolverFactory.getFileResolver();

        FileResolverUtil.addClassPathPattern(fileResolver);
        fileResolver
                .addResolvePath(FileResolverUtil.getClassPath(fileResolver));
        fileResolver.addResolvePath(FileResolverUtil.getWebClasses());
        try {
            fileResolver.addResolvePath(FileResolverUtil
                    .getWebLibJars(fileResolver));
        } catch (Exception e) {
            LOGGER.errorMessage("为文件扫描器添加webLibJars时出现异常", e);
        }
        fileResolver.addIncludePathPattern(TINY_JAR_PATTERN);
        addIncludePathPatterns(fileResolver, includePathPatterns);
        loadFileResolverConfig(fileResolver, applicationConfig);

        //加载本地
        LocalPropertiesFileProcessor localFileProcessor = new LocalPropertiesFileProcessor(applicationConfig);
        localFileProcessor.start();

        //远程配置
        if (remoteConfigReadClient != null) {
            RemoteConfigHandler remoteConfig = new RemoteConfigHandler(applicationConfig, remoteConfigReadClient);
            remoteConfig.start();
        }

        //合并替换配置
        MergePropertiesFileProcessor mergeProcessor = new MergePropertiesFileProcessor();
        mergeProcessor.start();

        fileResolver.addFileProcessor(new SpringBeansFileProcessor());

        fileResolver.addFileProcessor(new ConfigurationFileProcessor());
        // SpringUtil.regSpringConfigXml(xmlFile);
        fileResolver.resolve();
    }

    private static void loadFileResolverConfig(FileResolver fileResolver,
                                               String applicationConfig) {

        XmlStringParser parser = new XmlStringParser();
        XmlNode root = parser.parse(applicationConfig).getRoot();
        PathFilter filter = new PathFilter(root);
        List classPathList = filter
                .findNodeList("/application/file-resolver-configuration/class-paths/class-path");
        for (XmlNode classPath : classPathList) {
            fileResolver.addResolvePath(classPath.getAttribute("path"));
        }

        List includePatternList = filter
                .findNodeList("/application/file-resolver-configuration/include-patterns/include-pattern");
        for (XmlNode includePatternNode : includePatternList) {
            fileResolver.addIncludePathPattern(includePatternNode
                    .getAttribute("pattern"));
        }

    }

    private static void addIncludePathPatterns(FileResolver fileResolver, List includePathPatterns) {
        if (includePathPatterns == null) {
            return;
        }
        for (String pattern : includePathPatterns) {
            fileResolver.addIncludePathPattern(pattern);
        }
    }

    public static void stop() {
        if (init) {
            application.stop();
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy