ExpressionHelper.java 5.04 KB
package com.sitech.ismp.app.event;

import java.util.List;
import java.util.StringTokenizer;

import com.sitech.database.domain.TbCfgEvent;
import com.sitech.ismp.util.ConfigMatchUtil;
import com.sitech.util.ISMPDictionary;

/**
 * 该类用于在产生告警过程中可能用到的 告警表示式匹配等功能
 * 
 * @author winnerbao
 * 
 */
public class ExpressionHelper {

	/**
	 * ExpressionHelper.genCondition方法中得到的条件太严格了
	 * 原因是采集程序中一个方法返回的unit_id的前三位也可能不一样!!! 所以这里的函数意义调整为
	 * 
	 * kbp_classes为一系列10 , 10-10之类的字符串 生成UNIT ='10' or UNIT_ID like '10-10%' or
	 * UNIT_ID is null 这样的字符串
	 * 
	 * 输入: 10-11, 10-11-12, 10-11-12-13 输出:UNIT ='10' or UNIT_ID like '10-11%'
	 * or UNIT_ID is null
	 * 
	 * 1位的使用= 2位的使用 like value% =3, >3位的不处理,
	 * 
	 * @param unit_id为实际采集的完整的unit_id
	 * @return
	 */
	public static String genCondition(String unit_id) {
		String kbpClass = ExpressionHelper.getKbpClass(unit_id);

		// kbp_classes 该kbp_class肯定至少包括 xx-yy两位
		List<String> parentKbpClass = ISMPDictionary.getAllParent(kbpClass);

		String result = "";
		StringBuffer tempResult = new StringBuffer("");

		StringTokenizer st = null;

		for (String kbp : parentKbpClass) {
			st = new StringTokenizer(kbp, "-");
			int count = st.countTokens(); // 本kbp_class中的位数。 如10-10,返回为2
			// 使用其他方法,使用11位的话,如果扩充unitid的时候会出问题

			if (count == 1) {
				tempResult.append("or UNIT_ID='").append(kbp).append("' ");
			} else if (count == 2) {
				tempResult.append("or UNIT_ID like '").append(kbp)
						.append("%' ");
			}

		}// end for

		tempResult.append(" or UNIT_ID='*' or UNIT_ID is null");

		// 去掉开头的 or
		result = tempResult.substring(0 + 2, tempResult.length());
		return result;
	}

	/**
	 * 在relateExpressions中找到与当前unit_id ,kpi_id匹配,而且匹配度最高的一个
	 * 
	 * @param unit_id
	 * @param kpi_id
	 * @param relateExpressions
	 * @return
	 */
	public static TbCfgEvent getMostMatchExpression(String UNIT_ID, String KPI_ID, List<TbCfgEvent> eventConfigList) {

		if (eventConfigList == null || eventConfigList.size() == 0) {
			return null;
		}

		int index;
		int key = -1; // 用于记录当前最匹配的配置
		int length = -1; // 用于记录当前最匹配的配置的kbp_class长度
		try {
			// 遍历匹配的告警配置列表,找出最匹配的一条
			for (index = 0; index < eventConfigList.size(); index++) {
				TbCfgEvent cfg = eventConfigList.get(index);

				if (cfg.getKPI_ID().trim().equals(KPI_ID.trim())
						&& cfg.getUNIT_ID().trim().equals(UNIT_ID.trim())) {
					key = index;
					// Loger.debugLog("MATCHED,UNIT_ID="+UNIT_ID+",KPI_ID="+KPI_ID);
					break;
				}
				// 如果本条配置与atoEvent的kpi_id, unit_id , expression一致,那么计算其匹配度操作
				if (ConfigMatchUtil.matchKPI_ID(cfg.getKPI_ID(), KPI_ID)
						&& ConfigMatchUtil.matchUNIT_ID(cfg.getUNIT_ID(), UNIT_ID)) {

					int this_kbp_length = 0;

					if (cfg.getUNIT_ID() == null) {
						this_kbp_length = 0;
					} else {
						this_kbp_length = cfg.getUNIT_ID().length();
					}
					// 如果本配置kbp_class长度大于当前最大长度,那么记录本配置为最匹配配置
					// 只修改此处不能完全解决问题 ConfigMatchUtil.matchUNIT_ID 也需要修改 maxin
					if (this_kbp_length > length) {
						length = this_kbp_length;
						key = index;
					}

				}

			}// end for
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

		if (key != -1) { // 有匹配的,并得到了最匹配的
			return eventConfigList.get(key);
		} else {
			return null;
		}
	}

	/**
	 * 根据unit_id得到其冒号之前的部分 10-10:hhhh -> 10-10 10-11 -> 10-11
	 * 
	 * @param unit_id
	 * @return
	 */
	private static String getKbpClass(String unitId) {
		String kbpClass = "";
		int posColon = unitId.indexOf(':');
		if (posColon < 0) {
			kbpClass = unitId;
		} else {
			kbpClass = unitId.substring(0, posColon);
		}

		return kbpClass;
	}
	
	public static void main(String[] args) {
//		List<TbCfgEvent> eventConfigList = new ArrayList<TbCfgEvent>();
//		
//		TbCfgEvent cfg1 = new TbCfgEvent();
//		cfg1.setKPI_ID("TEST-01-01");
//		cfg1.setUNIT_ID("10-10-20:bnms_as2");
//		
//		TbCfgEvent cfg2 = new TbCfgEvent();
//		cfg2.setKPI_ID("TEST-01-01");
//		cfg2.setUNIT_ID("10-10-20:bnms_as2-/var/adm/ras/platfrm");
//		
//		TbCfgEvent cfg3 = new TbCfgEvent();
//		cfg3.setKPI_ID("TEST-01-01");
//		cfg3.setUNIT_ID("10-10-20-14:bnms_as");
//
//		eventConfigList.add(cfg1);
//		eventConfigList.add(cfg2);
//		eventConfigList.add(cfg3);
//		
//		TbCfgEvent cfg = ExpressionHelper.getMostMatchExpression("10-10-20-14:bnms_as2-/var/adm/ras/platform", "TEST-01-01", eventConfigList);
//		if(cfg == null){
//			System.out.println("-- null");
//		}else{
//			System.out.println(cfg.getUNIT_ID());
//		}
		
		;
		System.out.println(ExpressionHelper.genCondition("10-11-30-11:nms132-aaaa"));
	}
}