package com.byd.portal.pagedesign.util;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public final class PortalUiLoader{
private static Log log=LogFactory.getLog(PortalUiLoader.class);
private static JSONObject PORTALUICONFIGJSONOBJECT = null;
static{
refresh(false);
}
/**
* 生成控件配置JSONObject
*/
public static void refresh(Boolean beta){
PORTALUICONFIGJSONOBJECT = JSONObject.fromObject(getUiConfigFilesContent(beta));
}
/**
* 读取所有配置文件,生成字符串
*/
private static String getUiConfigFilesContent(final Boolean beta){
log.debug("beta"+beta);
//文件路径
String utfPath = PortalUiLoader.class.getClassLoader().getResource("portalUiConfig").getFile();
// String utfPath = PortalUiLoader.class.getResource("portalUiConfig").getFile();
String filePath = null;
log.debug("utfPath::::"+utfPath);
log.debug("filePath::::"+filePath);
try {
filePath = java.net.URLDecoder.decode(utfPath,"utf-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
File file = new File(filePath);
//配置文件集合
Iterator fileIterator = FileUtils.iterateFiles(file,new IOFileFilter(){
@Override
public boolean accept(File arg0) {
//非测试模式下,则读取min文件
if(beta){
if(StringUtils.contains(arg0.getName(),"-min.properties")){
return false;
}else{
return true;
}
}else{
if(StringUtils.contains(arg0.getName(),"-min.properties")){
return true;
}else{
return false;
}
}
}
@Override
public boolean accept(File arg0, String arg1) {
// TODO Auto-generated method stub
return false;
}
}, new IOFileFilter(){
@Override
public boolean accept(File arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean accept(File arg0, String arg1) {
// TODO Auto-generated method stub
return false;
}
});
StringBuffer sb = new StringBuffer();
sb.append("{");
boolean status = false;
while(fileIterator.hasNext()){
try {
File fileTmp = new File(fileIterator.next().toString());
String str = FileUtils.readFileToString(fileTmp);
if(status){
sb.append(",");
}
sb.append(str);
status = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
sb.append("}");
return sb.toString();
}
/**
* 这个是一个算法,请不要修改: 根据传入的控件名,返回控件所需要的Js文件引用路径集合
* @param comps 控件名数组
* @return LinkedHashMap Js文件引用路径字符串集合
*/
private static LinkedHashMap<String,String> getRequisiteJs(List<String> comps,LinkedHashMap<String,String> jsMap){
int i = 0;
String key = "";
LinkedHashMap<String, String> lhs = new LinkedHashMap<String, String>();
while(i<comps.size()){
String component = comps.get(i);
JSONObject jo = PORTALUICONFIGJSONOBJECT.getJSONObject(component);
if(!jo.isNullObject() && jo instanceof JSONObject){
if(StringUtils.equals(jo.getString("type").trim(),"js")){
if(jo.get("requires") instanceof JSONArray && !jo.getJSONArray("requires").isEmpty()){
List<String> compRequisiteJs = JSONArray.toList(jo.getJSONArray("requires"));
if(compRequisiteJs.size()>0){
lhs.putAll(getRequisiteJs(compRequisiteJs,jsMap));
}
}
key = jo.getString("path");
if(StringUtils.isNotEmpty(key)){
if(jsMap.get(key) == null){
lhs.put(key,"");
}
jsMap.put(key,"");
}
}
}
i++;
}
return lhs;
}
/**
* 获取request中的LinkedHashMap(记录同一个请求中需加载的JS js标签)
*/
private static LinkedHashMap<String,String> getRequestRequisiteJs(HttpServletRequest request){
if(request.getAttribute("jsMap") == null){
request.setAttribute("jsMap", new LinkedHashMap<String, String>());
}
return (LinkedHashMap<String,String>)request.getAttribute("jsMap");
}
/**
* 根据传入的JS文件路径Map、控件集合,返回控件所需要的Js文件引用标签字符串
* @param libPath 控件路径Map
* @param comps 控件集合
* @param HttpServletRequest request
* @param beta 应用模式
* @return 控件所需要的Js文件引用标签字符串
*/
public static String outJavaScriptTag(Map<String,String> libPath,String[] comps,HttpServletRequest request,Boolean beta){
if(beta){//debug模式下,需重新加载配置文件
refresh(beta);
}
List<String> compList = new ArrayList<String>();
String javaScriptTag = "";
for(int i = 0; i< comps.length; i++){
compList.add(comps[i]);
}
LinkedHashMap<String, String> lhs = getRequisiteJs(compList,getRequestRequisiteJs(request));
Set<String> compJsSet = lhs.keySet();
for(String compJs : compJsSet){
String key = StringUtils.substring(compJs,StringUtils.indexOf(compJs, "{")+1, StringUtils.indexOf(compJs, "}"));
String jsLib = libPath.get(key);
String tag = "<script type=\"text/javascript\" src=\""+StringUtils.replace(compJs, "{"+key+"}", jsLib)+"\"></script>\n";
javaScriptTag = javaScriptTag + tag;
}
return javaScriptTag;
}
/**
* 根据传入的字符串,返回控件所需要的Js文件引用标签字符串
* @param paramterConfig
* @param paramterConfig:{'yui':'yahoo/ui/widget/','portalUi':'portalUi/ui/widget/','components':['animation','button','datatable']}
* @param HttpServletRequest request
* @param Boolean beta 应用模式
* @return 控件所需要的Js文件引用标签字符串
*/
public static String outJavaScriptTag(String paramterConfig,HttpServletRequest request,Boolean beta){
log.debug("paramterConfig"+paramterConfig);
if(beta){//debug模式下,需重新加载配置文件
refresh(beta);
}
String javaScriptTag = "";
log.debug("javascriptTag:"+javaScriptTag);
List<String> compList = new ArrayList<String>();
JSONObject paramterConfigJsonObject = JSONObject.fromObject(paramterConfig);
JSONArray compArray = paramterConfigJsonObject.getJSONArray("components");
for(int i = 0; i< compArray.size(); i++){
compList.add(compArray.getString(i));
}
LinkedHashMap<String,String> lhs = getRequisiteJs(compList,getRequestRequisiteJs(request));
Set<String> compJsSet = lhs.keySet();
for(String compJs : compJsSet){
String key = StringUtils.substring(compJs,StringUtils.indexOf(compJs, "{")+1, StringUtils.indexOf(compJs, "}"));
String jslib = paramterConfigJsonObject.getString(key);
String tag = "<script type=\"text/javascript\" src=\""+StringUtils.replace(compJs, "{"+key+"}", jslib)+"\"></script>\n";
javaScriptTag = javaScriptTag + tag;
}
log.debug("javascriptTag1:"+javaScriptTag);
return javaScriptTag;
}
/**
* 根据传入的字符串,返回控件所需要的Js文件引用标签字符串
* @param paramterConfig
* @param paramterConfig:{'yui':'yahoo/ui/widget/','portalUi':'portalUi/ui/widget/','components':['animation','button','datatable']}
* @param HttpServletRequest request
* @return 控件所需要的Js文件引用标签字符串
*/
public static String outJavaScriptTag(String paramterConfig,HttpServletRequest request){
return outJavaScriptTag(paramterConfig,request,false);
}
}