
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