net.ymate.platform.configuration.Cfgs Maven / Gradle / Ivy
/*
* Copyright 2007-2107 the original author or authors.
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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 net.ymate.platform.configuration;
import java.io.File;
import java.net.URL;
import java.security.AccessControlException;
import net.ymate.platform.base.YMP;
import net.ymate.platform.commons.i18n.I18N;
import net.ymate.platform.commons.util.ClassUtils;
import net.ymate.platform.commons.util.FileUtils;
import net.ymate.platform.commons.util.ResourceUtils;
import net.ymate.platform.commons.util.RuntimeUtils;
import net.ymate.platform.commons.util.SystemEnvUtils;
import net.ymate.platform.configuration.annotation.Configuration;
import net.ymate.platform.configuration.annotation.ConfigurationProvider;
import net.ymate.platform.configuration.provider.IConfigurationProvider;
import org.apache.commons.lang.StringUtils;
/**
*
* Cfgs
*
*
* 配置管理类,用于管理已成功加载的IConfig配置实例对象;
*
*
* @author 刘镇([email protected])
* @version 0.0.0
*
*
* 版本号 动作 修改人 修改时间
*
*
*
* 0.0.0
* 创建类
* 刘镇
* 2011-8-27上午02:17:46
*
*
*/
public class Cfgs {
/**
* 当前配置体系框架初始化配置对象
*/
private static ICfgConfig __CFG_CONFIG;
private static boolean __IS_INITED;
private static String __CONFIG_HOME;
private static String __PROJECT_HOME;
private static String __MODULE_HOME;
private static String __USER_HOME;
private static String __USER_DIR;
/**
* 初始化配置体系管理器
*
* @param config
* @throws ConfigurationInitializeException
*/
public static void initialize(ICfgConfig config) throws ConfigurationInitializeException {
System.out.println(I18N.formatMessage(YMP.__LSTRING_FILE, null, null, "ymp.configuration.module_init"));
if (config == null) {
throw new ConfigurationInitializeException(I18N.formatMessage(YMP.__LSTRING_FILE, null, null, "ymp.configuration.module_init_parameter_null"));
}
__CFG_CONFIG = config;
__CONFIG_HOME = config.getConfigHome();
if (StringUtils.isBlank(config.getConfigHome())) {
// 尝试通过运行时变量或系统变量获取CONFIG_HOME参数
__CONFIG_HOME = System.getenv("CONFIG_HOME");
if (StringUtils.isBlank(__CONFIG_HOME)) {
__CONFIG_HOME = SystemEnvUtils.getSystemEnv("CONFIG_HOME");
}
}
//
if (StringUtils.isNotBlank(__CONFIG_HOME)) {
File _configHomeFile = new File(__CONFIG_HOME);
if (!_configHomeFile.exists() || !_configHomeFile.isDirectory()) {
throw new ConfigurationInitializeException(I18N.formatMessage(YMP.__LSTRING_FILE, null, null, "ymp.configuration.config_home_invalid"));
}
__CONFIG_HOME = FileUtils.fixSeparator(_configHomeFile.getPath());
System.setProperty("user.dir", __CONFIG_HOME);
// 在配置体系主目录(configHome)存在的情况下,处理项目主目录
if (StringUtils.isNotBlank(config.getProjectName())) {
__PROJECT_HOME = FileUtils.fixSeparator(new File(__CONFIG_HOME + ICfgConfig.PROJECTS_FORLDER_NAME + File.separator + config.getProjectName()).getPath());
System.setProperty("user.dir", __PROJECT_HOME);
// 在项目主目录(projectHome)存在的情况下,处理模块主目录
if (StringUtils.isNotBlank(config.getModuleName())) {
__MODULE_HOME = FileUtils.fixSeparator(new File(__PROJECT_HOME + ICfgConfig.MODULES_FORLDER_NAME + File.separator + config.getModuleName()).getPath());
System.setProperty("user.dir", __MODULE_HOME);
}
}
//
StringBuilder _conf = new StringBuilder("{\n ");
_conf.append("CONFIG_HOME").append("=").append(__CONFIG_HOME);
//
__USER_HOME = System.getProperty("user.home", "");
if (StringUtils.isNotBlank(__USER_HOME)) {
__USER_HOME = FileUtils.fixSeparator(__USER_HOME);
}
//
_conf.append(", \n ").append("USER_HOME").append("=").append(__USER_HOME);
//
__USER_DIR = System.getProperty("user.dir", "");
if (StringUtils.isNotBlank(__USER_DIR)) {
__USER_DIR = FileUtils.fixSeparator(__USER_DIR);
}
__IS_INITED = true;
//
_conf.append(", \n ").append("USER_DIR").append("=").append(__USER_DIR).append("\n}");
//
System.out.println(_conf.toString());
System.out.println(I18N.formatMessage(YMP.__LSTRING_FILE, null, null, "ymp.configuration.module_init_final"));
} else {
throw new ConfigurationInitializeException(I18N.formatMessage(YMP.__LSTRING_FILE, null, null, "ymp.configuration.config_home_invalid"));
}
}
/**
* @return 获取当前配置体系框架初始化配置对象
*/
public static ICfgConfig getConfig() {
return __CFG_CONFIG;
}
/**
* @return 判断是否已初始化完成
*/
public static boolean isInited() {
return __IS_INITED;
}
/**
* 智能搜索配置文件真实资源路径,先在配置体系中查找,再到项目 CLASSPATH 路径中查找,若 cfgFile 以 "jar:" 开头则直接返回
*
* @param cfgFile 配置文件相对路径及名称
* @return 配置文件真实路径
*/
public static String smartSearch(String cfgFile) {
if (StringUtils.isBlank(cfgFile)) {
return null;
}
File _targetFile = search(cfgFile);
if (_targetFile == null) {
if (cfgFile.startsWith("jar:")) {
return cfgFile;
}
URL _targetFileURL = ResourceUtils.getResource(cfgFile, Cfgs.class);
if (_targetFileURL != null) {
_targetFile = FileUtils.toFile(_targetFileURL);
return _targetFile == null ? _targetFileURL.toString() : _targetFile.getPath();
}
} else {
return _targetFile.getPath();
}
return null;
}
/**
* 按照模块路径->项目路径->主路径(CONFIG_HOME)->用户路径(user.dir)->系统用户路径(user.home)的顺序寻找指定文件
*
* @param cfgFile 配置文件路径及名称
* @return 找到的文件File对象,只要找到存在的File,立即停止寻找并返回当前File实例
*/
public static File search(String cfgFile) {
if (StringUtils.isBlank(cfgFile)) {
return null;
}
// 若指定的 cfgFile 为文件绝对路径名,则直接返回
File _result = new File(cfgFile);
if (_result.isAbsolute()) {
return _result;
}
// 到 moduleHome(模块路径)路径中去寻找 cfgFile 指定的文件
if (StringUtils.isNotBlank(__MODULE_HOME)) {
_result = new File(__MODULE_HOME + cfgFile);
if (_result.canRead() && _result.isAbsolute() && _result.exists()) {
return _result;
}
}
// 到 projectHome(项目路径)路径中去寻找 cfgFile 指定的文件
if (StringUtils.isNotBlank(__PROJECT_HOME)) {
_result = new File(__PROJECT_HOME + cfgFile);
if (_result.canRead() && _result.isAbsolute() && _result.exists()) {
return _result;
}
}
// 到 configHome(主路径)路径中去寻找 cfgFile 指定的文件
if (StringUtils.isNotBlank(__CONFIG_HOME)) {
_result = new File(__CONFIG_HOME + cfgFile);
if (_result.canRead() && _result.isAbsolute() && _result.exists()) {
return _result;
}
}
try {
// 到 userDir(用户路径)路径中去寻找 cfgFile 指定的文件
if (StringUtils.isNotBlank(__USER_DIR)) {
_result = new File(__USER_DIR + cfgFile);
if (_result.canRead() && _result.isAbsolute() && _result.exists()) {
return _result;
}
}
// 到 osUserHome(系统用户路径)路径中去寻找 cfgFile 指定的文件
if (StringUtils.isNotBlank(__USER_HOME)) {
_result = new File(__USER_HOME + cfgFile);
if (_result.canRead() && _result.isAbsolute() && _result.exists()) {
return _result;
}
}
} catch (AccessControlException e) {
RuntimeUtils.unwrapThrow(e).printStackTrace(System.err);
}
return null;
}
public static String getModuleHome() {
return __MODULE_HOME;
}
public static String getUserHome() {
return __USER_HOME;
}
public static String getProjectHome() {
return __PROJECT_HOME;
}
public static String getUserDir() {
return __USER_DIR;
}
public static String getConfigHome() {
return __CONFIG_HOME;
}
/**
* 填充配置对象
*
* @param config 配置对象,不可为空
* @param cfgFileName 配置所需要的装载参数
* @param needSearch 是否采用智能搜索
* @return 是否成功装载配置
*/
public static synchronized boolean fillCfg(IConfiguration config, String cfgFileName, boolean needSearch) {
return fillCfg(null, config, cfgFileName, needSearch);
}
/**
* 根据自定义配置提供者填充配置对象
*
* @param providerClass 配置提供者类对象,若为空则采用框架默认
* @param config 配置对象,不可为空
* @param cfgFileName 配置所需要的装载参数
* @param needSearch 是否采用智能搜索
* @return 是否成功装载配置
*/
public static synchronized boolean fillCfg(Class extends IConfigurationProvider> providerClass, IConfiguration config, String cfgFileName, boolean needSearch) {
if (__IS_INITED) {
if (config == null) {
return false;
}
try {
IConfigurationProvider _provider = null;
if (providerClass != null) {
_provider = ClassUtils.impl(providerClass, IConfigurationProvider.class);
}
if (_provider == null) {
_provider = __CFG_CONFIG.getConfigurationProviderClassImpl();
}
if (needSearch) {
_provider.load(smartSearch(cfgFileName));
} else {
_provider.load(cfgFileName);
}
config.initialize(_provider);
return true;
} catch (ConfigurationLoadException e) {
System.err.println("Warnring: " + e.getMessage() + " [" + StringUtils.trimToEmpty(cfgFileName) + "]");
return false;
}
} else {
System.err.println(I18N.formatMessage(YMP.__LSTRING_FILE, null, null, "ymp.configuration.module_not_init"));
}
return false;
}
public static boolean fillCfg(IConfiguration config, String cfgFileName) {
return fillCfg(config, cfgFileName, true);
}
/**
* 装载配置,根据Configuration注解指定的配置文件进行加载,否则默认使用当前配置类对象的SimpleName作为配置文件名,即:SimpleName.CfgTagName.xml
*
* @param config 配置对象,不可为空
* @param needSearch 是否采用智能搜索
* @return 是否成功装载配置
*/
public static boolean fillCfg(IConfiguration config, boolean needSearch) {
if (config != null) {
String _cfgFileName = null;
Configuration _configuration = config.getClass().getAnnotation(Configuration.class);
if (_configuration != null) {
_cfgFileName = _configuration.value();
}
if (StringUtils.isBlank(_cfgFileName)) {
_cfgFileName = "cfgs/" + config.getClass().getSimpleName().toLowerCase() + config.getCfgTagName() + ".xml";
}
ConfigurationProvider _providerClass = config.getClass().getAnnotation(ConfigurationProvider.class);
return fillCfg((_providerClass != null ? _providerClass.value() : null), config, _cfgFileName, needSearch);
}
return false;
}
public static boolean fillCfg(IConfiguration config) {
return fillCfg(config, true);
}
}