路径问题

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();
   




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值