package jef.database.meta;
import java.io.BufferedReader;
import java.net.URL;
import jef.common.log.LogUtil;
import jef.database.IQueryableEntity;
import jef.database.annotation.PartitionTable;
import jef.database.annotation.PartitionTableImpl;
import jef.json.JsonUtil;
import jef.tools.IOUtils;
import jef.tools.StringUtils;
/**
* 缺省分表规则加载器,首先查找xxx.xxx.xxx.clzname.partition文件,然后使用annotation。
*
* 扩展这可以继承此类实现自定义的配置加载方式
*
* 文件为json结构
*
* @author jiyi
*
*/
public class DefaultPartitionStrategyLoader implements PartitionStrategyLoader {
public PartitionTable get(Class<? extends IQueryableEntity> clz) {
String data=getJsonDataConfig(clz);
if(data!=null && data.length()>0){
return parseJsonConfig(data);
}
URL url = getResource(clz);
if (url != null) {
return loadFromResourceUrl(url);
}
return loadFromClassAnnotation(clz);
}
/**
* 从URL中获取
* @param url
* @return
*/
protected PartitionTable loadFromResourceUrl(URL url) {
BufferedReader reader = null;
try {
reader= IOUtils.getReader(url.openStream(), null);
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
if (StringUtils.isEmpty(line) || line.startsWith("--")) {
continue;
}
sb.append(line);
sb.append('\n');
}
String data = sb.toString();
if (!data.startsWith("{")) {
data = StringUtils.concat("{", data, "}");
}
LogUtil.info("Loading partition strategy from:{}", url.getPath());
PartitionTableImpl table = JsonUtil.toObject(data, PartitionTableImpl.class);
System.out.println(JsonUtil.toJson(table));
return table;
} catch (Exception e) {
LogUtil.exception("The Partition rule load failure in file:" + url + ", it will be ignored!", e);
return null;
} finally {
IOUtils.closeQuietly(reader);
}
}
private PartitionTable loadFromClassAnnotation(Class<? extends IQueryableEntity> clz) {
PartitionTable table = clz.getAnnotation(PartitionTable.class);
if (table != null)
LogUtil.info(StringUtils.concat("Loading the partition strategy from annotation.[", clz.getName(), "]", JsonUtil.toJsonWithoutQuot(PartitionTableImpl.create(table))));
return table;
}
/**
* 解析Json配置
* @param data
* @return
*/
protected PartitionTable parseJsonConfig(String data) {
PartitionTableImpl table = JsonUtil.toObject(data, PartitionTableImpl.class);
return table;
}
/**
* 寻找配置资源并返回
* @param clz
* @return
*/
protected URL getResource(Class<? extends IQueryableEntity> clz){
String fileName = "/" + clz.getName() + ".json";
return clz.getResource(fileName);
}
/**
* 得到JSON的分区配置。继承此类可以扩展配置读取的方式
* @param clz
* @return
*/
protected String getJsonDataConfig(Class<? extends IQueryableEntity> clz) {
return null;
}
}