package com.github.ebnew.ki4so.core.app;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.github.ebnew.ki4so.common.utils.StringUtils;
import com.github.ebnew.ki4so.core.dao.fs.KnightFileSystemDao;
import org.apache.log4j.Logger;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author zhenglu
* @since 15/4/26
*/
public class KnightAppServiceImpl extends KnightFileSystemDao implements KnightAppService {
private static final Logger logger = Logger.getLogger(KnightAppServiceImpl.class);
//外部文件,优先级最高
private static final String DEFAULT_EXTERNAL_FILE = "/Users/zhenglu/Documents/study/ki4so/ki4so-core/src/main/resources/apps.js";
//默认的数据文件地址,在classpath下
private static final String CLASS_PATH_FILE = "apps.js";
//应用的映射表,appid为key,value为应用信息
private Map<String,KnightApp> appMap = null;
//服务本身应用信息
private KnightApp knightApp = null;
//在bean初始化init
public void init(){
this.classPathData = CLASS_PATH_FILE;
this.externalData = DEFAULT_EXTERNAL_FILE;
loadAppData();
}
@Override
protected void loadAppData() {
try{
if(appMap != null){
appMap.clear();
}
appMap = null;
String content = readDataFromFile();
List<KnightApp> appList = JSON.parseObject(content, new TypeReference<List<KnightApp>>(){});
appendSlashToHost(appList);
if(appList != null && appList.size() > 0 ){
appMap = new HashMap<String, KnightApp>();
for(KnightApp app : appList){
appMap.put(app.getAppId(),app);
if(knightApp == null){
if(app.isKnightService()){
this.knightApp = app;
}
}
}
}
}catch (Exception e){
logger.error("load app data error ::" + e.getMessage());
e.printStackTrace();
}
}
/**
* 若主机host不以"/"结尾,则添加 "/" 否则不用处理
* @param appList
*/
private void appendSlashToHost(List<KnightApp> appList){
for(KnightApp app : appList){
if(app.getHost() != null && app.getHost().length() > 0 && !app.getHost().endsWith("/")){
app.setHost(app.getHost() + "/");
}
}
}
@Override
public KnightApp findAppById(String appId) {
if(appMap != null){
appMap.get(appId);
}
return null;
}
@Override
public KnightApp findKi4soServerApp() {
return this.knightApp;
}
@Override
public KnightApp findAppByHost(String host) {
if(StringUtils.isEmpty(host)){
return null;
}
Collection<KnightApp> apps = appMap.values();
KnightApp knightApp1 = findAppByUrl(apps,host);
if(knightApp1 == null){
knightApp1 = findAppByUrl(apps,host+"/");
}
return knightApp1;
}
private KnightApp findAppByUrl(Collection<KnightApp> apps,String url){
if(apps == null || apps.size() == 0 || StringUtils.isEmpty(url)){
return null;
}
for(KnightApp app :apps){
if(!StringUtils.isEmpty(url) && url.startsWith(app.getHost())){
return app;
}
}
return null;
}
}