package com.zte.ums.csp.pm.osf.mml;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.zte.ums.csp.pm.osf.mml.api.FileUtil;
import com.zte.ums.csp.pm.osf.mml.api.PathUtil;
import com.zte.ums.csp.pm.osf.mml.model.Index;
import com.zte.ums.csp.pm.osf.mml.model.ScenePmQueryObject;
import com.zte.ums.csp.pm.osf.rmadapter.FormulaCalculator;
import com.zte.ums.uep.api.util.DebugPrn;
public class PmMmlExport {
private DebugPrn logger = new DebugPrn(PmMmlExport.class.getName());
private boolean mmlAsyn;
private ExportUtil exportUtil = null;
private CSVProcess csvProcess = null;
private List<String> counterIdList = new ArrayList<String>();
public PmMmlExport(boolean mmlAsyn) {
this.mmlAsyn = mmlAsyn;
}
public CSVProcess getCSVProcess() {
return this.csvProcess;
}
public String buildScenePmCmd(ScenePmQueryObject messageObject) {
String product = messageObject.getProduct();
Index index = messageObject.getIndex();
List<String> oidList = messageObject.getOidList();
if (product == "2G") {
// 如果buildRNCPmCmd()可以直接调用,就直接使用
} else if (product == "3G") {
} else {
}
return null;
}
// 构建查询网元性能数据的mml , 三个参数 “网元对象的ID , product, 指标”
public String buildRNCPmCmd(String NEoid, String product, Index index,
String startData, String endData) {
if (NEoid == null || NEoid.equals("") || product == null
|| product.equals("") || index == null) {
return null;
}
StringBuilder cmd = new StringBuilder();
String NETYPEID = "\"" + product + "\""; // 根据指令格式,该参数值需要双引号括起来
String MEASOBJTYPEID = "\"" + index.getMocId() + "\"";
String QUERYITEMLIST = getQueryItemListByIndex(index);
String MEASOBJMOI = NEoid;
String QUERYGRAN = "15MIN";
String FILETYPE = "CSV";
String LOCFILTERLEVEL = "FILTERTYPE_MO";
cmd.append("QUERY PMDATA:NETYPEID=" + NETYPEID + ",");
cmd.append("MEASOBJTYPEID=" + MEASOBJTYPEID + ",");
cmd.append("QUERYITEMLIST=" + QUERYITEMLIST + ",");
cmd.append("MEASOBJMOI=" + MEASOBJMOI + ",");
if (startData != null && !startData.equals("")) {
String STARTDATE = "\"" + startData + "\"";
cmd.append("STARTDATE=" + STARTDATE + ",");
}
if (endData != null && !endData.equals("")) {
String ENDDATE = "\"" + endData + "\"";
cmd.append("ENDDATE=" + ENDDATE + ",");
}
cmd.append("QUERYGRAN=" + QUERYGRAN + ",");
cmd.append("FILETYPE=" + FILETYPE + ",");
cmd.append("LOCFILTERLEVEL=" + LOCFILTERLEVEL);
return cmd.toString();
}
// 通过“公式(count)”得到QUERYITEMLIST
public String getQueryItemListByIndex(Index index) {
String QueryItemData = "";
String formula = index.getCount();
if (formula.length() == 0) {
return null;
}
int length = formula.length();
List<String> operandFormList = new ArrayList<String>();
int pos = 0;
pos = formula.indexOf("C", 0);
while (pos >= 0 && pos < length) {
String sCounter = paraseIndexCounterName(formula, pos);
this.counterIdList.add(sCounter);
String form = "\"COUNTER\"-" + "\"" + sCounter + "\"--";
operandFormList.add(form);
pos = pos + sCounter.length();
pos = formula.indexOf("C", pos);
}
int listSize = operandFormList.size();
String[] temp = new String[listSize];
String[] datas = (String[]) operandFormList.toArray(temp);
return QueryItemData += StringUtils.join(datas, '&');
}
public List<String> getCounterIdList() {
return counterIdList;
}
public void setCounterIdList(List<String> counterIdList) {
this.counterIdList = counterIdList;
}
private String paraseIndexCounterName(String formula, int startPos) {
int length = formula.length();
int endPos = startPos + 1;
while (endPos < length) {
char c = formula.charAt(endPos);
if (c < '0' || c > '9') {
break;
}
endPos++;
}
return formula.substring(startPos, endPos);
}
/*
* public synchronized void scenePmMmlExport(String mml) {
* logger.info("++++++ Start mml export data at " +
* Calendar.getInstance().getTime().toString()); // icm异步或同步 if (mmlAsyn) {
* logger.info("Start mml export asynchronously");
* exportUtil.sendMmlAsynchronously(mml, new AsynchronousListener() {
*
* @Override public void process(String fileName) {
* logger.info("Start to process asynchronous data..."); // 解析文件的方法可能需要独立取出
* // 1、文件的路径需要重新“拼” // 2、当前已经存在的解析文件的方式是否完全适用(处理数据的方式改变了)
* processSceneModel(fileName); } }); } else {
* logger.info("Start mml export synchronously.");
*
* // 指令返回的结果,现在按照路径处理 String filePath = exportUtil.sendMml(mml); //
* processModel(filePath); processSceneModel(filePath); } }
*/
/*
* private void processSceneModel(String filePath) { File file = new
* File(filePath); String fileName = file.getName(); // 是否需要清空临时目录?
* FileUtil.clear(PathUtil.getTmpCmDir()); // 根据mml指令得到file path
* 判断路径是否需要重新“拼” FileUtil.movefile(PathUtil.getSceneSrcDir(), fileName,
* PathUtil.getTmpSceneDir(), fileName); csvProcess = new
* CSVProcess(PathUtil.getTmpCmDir(), fileNames); logger.warn("fileNames:" +
* fileNames.toString());
* logger.warn("++++++ export csv file from icm finished");
*
* // 解析“场景scene文件”,解析结果格式的封装自然是适应计算方式 //
* 汇总:对同一种“计数器”的值进行处理(汇总的方式不一定就是sum,还是重新开个方法写是正确的)
* csvProcess.readSceneCSVFiles(); }
*/
public synchronized String mmlExport(String mml) {
String filePath = null;
if (mml == null || mml.equals("")) {
return null;
}
logger.info("Start mml export data at "
+ Calendar.getInstance().getTime().toString());
logger.info("Start mml export synchronously.");
filePath = exportUtil.sendMml(mml);
return filePath;
}
public void processModel(String filePath) {
StringBuilder fileNameWithDateDir = new StringBuilder();
// 通过文件系统的“分隔符”划分,,在wins和linux分隔符不同
//注意这里面有个大问题,如果在wins系统下,路径为
// \home\dwe\fdef\frfr\frfrf
//对这样的路径 用split(File.separator)无法分割 ,因为这时候的文件分隔符是“转义字符的工具”--反斜杠
//这个时候忽然意思到代码里面直接拼路径的原因了
//就是在规避我上面遇到的问题
//也正好,文件的目录是规定好的,没有动态改变的,不需要复杂的从路径中“分割”,在wins下通过split(File.separator)自然是不会成功的
//要采取其他方法
String[] dirFileNames = filePath.split(File.separator);
int length = dirFileNames.length;
String fileName = dirFileNames[length - 1];
String dateDir = dirFileNames[length - 2];
fileNameWithDateDir.append(dateDir).append(File.separator)
.append(fileName);
// 是否需要清空临时目录?
FileUtil.clear(PathUtil.getTmpCmDir());
FileUtil.movefile(PathUtil.getSrcDir(), fileNameWithDateDir,
PathUtil.getTmpCmDir(), fileName);
List<String> counterIdList = getCounterIdList();
csvProcess = new CSVProcess(PathUtil.getTmpCmDir(), fileName,
counterIdList);
logger.warn("fileNames:" + filePath.toString());
logger.warn("++++++ export csv file from icm finished");
csvProcess.readCSVFiles();
}
public Map calculateFormula(Map mapElementsGroupByGranularity, Index index) {
FormulaCalculator calculator = new FormulaCalculator();
Map<String, HashMap<String, Double>> resultMapGroupByGranularity = new HashMap<String, HashMap<String, Double>>();
HashMap<String, Double> resultMapGroupByCell = new HashMap<String, Double>();
String formula = index.getCount();
double result = 0;
// 得到公式里面的参数
/*
* String[] operandsInFromula = StringUtils .split(formula,
* "[(|+|)|/|*|-]");
*/
// int operandsNum = operandsInFromula.length;
// 存放参数对应的值
// String[] values = new String[operandsNum];
// 对应的参数值来自读取的csv文件,每行的记录放在map中
Iterator<String> iterator = mapElementsGroupByGranularity.keySet()
.iterator();
while (iterator.hasNext()) {
String granularityKey = iterator.next();
HashMap<String, Map<String, Double>> mapDifferByCell = (HashMap<String, Map<String, Double>>) mapElementsGroupByGranularity
.get(granularityKey);
Iterator<String> it = mapDifferByCell.keySet().iterator();
while (it.hasNext()) {
String cellKey = (String) it.next();
Map<String, Double> jexLvarsMap = (Map<String, Double>) mapDifferByCell
.get(cellKey);
if (jexLvarsMap == null) {
continue;
}
calculator.setFormula(formula);
calculator.setVars(jexLvarsMap);
try {
result = calculator.calculate();
} catch (Exception e) {
e.printStackTrace();
}
resultMapGroupByCell.put(cellKey, result);
}
resultMapGroupByGranularity.put(granularityKey,
resultMapGroupByCell);
}
return resultMapGroupByGranularity;
}
}
StringBuilder fileNameWithDateDir = new StringBuilder();
File file = new File(filePath);
// String fileName = file.getName();
int fileNameIndex =filePath.indexOf(fileName);
int dirParentIndex = filePath.indexOf("mml-query-file");
// int length =
还是这样处理最好:因为返回的是文件的路径,直接截取包含runDate之后的路径,然后直接拼出“路径”
fileNameWithDateDir.append(dateDir).append(File.separator)
.append(fileName);
// 是否需要清空临时目录?
FileUtil.clear(PathUtil.getTmpCmDir());
FileUtil.movefile(PathUtil.getSrcDir(), fileNameWithDateDir,
PathUtil.getTmpCmDir(), fileName);
List<String> counterIdList = getCounterIdList();
csvProcess = new CSVProcess(PathUtil.getTmpCmDir(), fileName,
counterIdList);
logger.warn("fileNames:" + filePath.toString());
logger.warn("++++++ export csv file from icm finished");
csvProcess.readCSVFiles();