package com.owent.xresloader.engine;
import com.owent.xresloader.scheme.SchemeConf;
import com.owent.xresloader.scheme.SchemeKeyConf;
import java.util.LinkedList;
/**
* Created by owentou on 2014/10/10.
*/
public class IdentifyEngine {
/**
* 把配置名称转换成标识符
*
* @param _name 配置名称
* @return
*/
static public IdentifyDescriptor n2i(String _name, int index) {
String[] segs = _name.trim().split("\\.");
IdentifyDescriptor ret = new IdentifyDescriptor();
ret.index = index;
for (int i = 0; i < segs.length; ++i) {
if (i == segs.length - 1) {
int verify_index = segs[i].lastIndexOf('@');
if (verify_index > 0) {
String old_val = segs[i];
segs[i] = make_word(old_val.substring(0, verify_index));
ret.verifier = old_val.substring(verify_index + 1);
} else {
segs[i] = make_word(segs[i]);
}
} else {
segs[i] = make_word(segs[i]);
}
}
ret.name = String.join(".", segs);
return ret;
}
static private String make_word(String ident) {
SchemeKeyConf cfg = SchemeConf.getInstance().getKey();
// 如果无分词规则就直接返回
if (null == cfg.getKeyWordRegex()) {
if (SchemeKeyConf.KeyCase.LOWER == cfg.getLetterCase())
ident = ident.toLowerCase();
else if (SchemeKeyConf.KeyCase.UPPER == cfg.getLetterCase())
ident = ident.toUpperCase();
return cfg.getPrefix() + ident + cfg.getSuffix();
}
// 过滤不合法前缀
if (null != cfg.getKeyWordRegexPrefixRule()) {
int invalid_index = 0;
for (; invalid_index < ident.length(); ++invalid_index) {
if (cfg.getKeyWordRegexPrefixRule().matcher(ident.substring(invalid_index, invalid_index + 1)).matches())
break;
}
ident = ident.substring(invalid_index);
}
// 分词
LinkedList<String> words = new LinkedList<String>();
String this_word = "";
for (char c : ident.toCharArray()) {
if (cfg.getKeyWordRegex().matcher(String.valueOf(c)).matches()) {
if (!this_word.isEmpty()) {
if (SchemeKeyConf.KeyCase.LOWER == cfg.getLetterCase())
this_word = this_word.toLowerCase();
else if (SchemeKeyConf.KeyCase.UPPER == cfg.getLetterCase())
this_word = this_word.toUpperCase();
words.add(this_word);
}
if (null != cfg.getKeyWordRegexRemoveRule() && !cfg.getKeyWordRegexRemoveRule().matcher(String.valueOf(c)).matches())
this_word = String.valueOf(c);
else
this_word = "";
} else {
this_word += c;
}
}
// 最后一个词
if (!this_word.isEmpty()) {
if (SchemeKeyConf.KeyCase.LOWER == cfg.getLetterCase())
this_word = this_word.toLowerCase();
else if (SchemeKeyConf.KeyCase.UPPER == cfg.getLetterCase())
this_word = this_word.toUpperCase();
words.add(this_word);
}
// 加前后缀,加分词符
return cfg.getPrefix() + String.join(cfg.getWordSplit(), words) + cfg.getSuffix();
}
static public boolean isAbsPath(String path) {
path = path.trim();
return path.charAt(0) == '/' || (path.length() > 1 && path.charAt(1) == ':' && Character.isLetter(path.charAt(0)));
}
}