package org.nutz.mvc.impl;
import java.io.Reader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.nutz.lang.Lang;
import org.nutz.lang.segment.CharSegment;
import org.nutz.lang.segment.Segment;
import org.nutz.lang.util.MultiLineProperties;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.MessageLoader;
import org.nutz.mvc.Mvcs;
import org.nutz.resource.NutResource;
import org.nutz.resource.Scans;
public class NutMessageLoader implements MessageLoader {
private static final Log log = Logs.get();
public Map<String, Map<String, Object>> load(String refer) {
Map<String, Map<String, Object>> re = new HashMap<String, Map<String, Object>>();
List<NutResource> allnrs = Scans.me().scan(refer, "^.+[.]properties$");
if (log.isDebugEnabled())
log.debugf("Load Messages in %s resource : [%s]", allnrs.size(), allnrs);
// 求取路径的最大长度
int max = 0;
for (NutResource nr : allnrs) {
String[] nms = nr.getName().split("[\\\\/]");
max = Math.max(max, nms.length);
}
// 根据第二级目录,编制列表
Map<String, List<NutResource>> map = new HashMap<String, List<NutResource>>();
for (NutResource nr : allnrs) {
String langType;
String resName = nr.getName();
if (resName.contains("/"))
langType = resName.substring(0, resName.indexOf('/'));
else if (resName.contains("\\"))
langType = resName.substring(0, resName.indexOf('\\'));
else
langType = Mvcs.DEFAULT_MSGS;
// 按语言类型编制
List<NutResource> list = map.get(langType);
if (null == list) {
list = new ArrayList<NutResource>(10);
map.put(langType, list);
}
list.add(nr);
}
// 根据语言的分类,依次构建字符串 Map
try {
for (Entry<String, List<NutResource>> entry : map.entrySet()) {
List<NutResource> nrs = entry.getValue();
String langType = entry.getKey();
// 循环读取该语言的文件夹
for (NutResource nr : nrs) {
// 读取多行属性
MultiLineProperties p = new MultiLineProperties();
Reader r = nr.getReader();
p.load(r);
r.close();
// 获取当前语言的 Map
Map<String, Object> msgs = re.get(langType);
if (null == msgs) {
msgs = new NutMessageMap();
re.put(langType, msgs);
}
// 将本地化字符串增加到当前语言
for (String key : p.keySet()) {
String str = p.get(key);
Segment seg = (new CharSegment()).valueOf(str);
if (seg.keys().isEmpty())
msgs.put(key, str);
else
msgs.put(key, seg);
}
} // ~ 内部循环结束
}
}
catch (Exception e) {
throw Lang.wrapThrow(e);
}
// 看看有没有默认的,没有的话,取第一个为默认
// TODO 这段代码应该在 1.b.46 之后的某一个版本删掉
if (!re.containsKey(Mvcs.DEFAULT_MSGS)) {
if (re.size() > 0) {
String first_lang = re.keySet().iterator().next();
re.put(Mvcs.DEFAULT_MSGS, re.get(first_lang));
}
}
if (log.isDebugEnabled())
log.debugf("Message Loaded, size = %s", re.size());
// 返回结果
return re;
}
}