Мы используем MVEL для оценки выражения путем передачи карты в объект контекста. Карта содержит информацию о ловушке SNMP, такую как OID и ее значения. например, образец карты содержит следующие ключи и значения.
Map<String,String> trapMap = new HashMap();
trapMap.put("1.3.6.1.4.1.9.9.311.1.1.2.1.3", "(7362915) 20:27:09.15");
trapMap.put("1.3.6.1.4.1.9.9.311.1.1.2.1.2", "2.2");
trapMap.put("1.3.6.1.4.1.9.9.311.1.1.2.1.19", "0");
trapMap.put("1.3.6.1.4.1.9.9.311.1.1.2.1.16", "SIMPLE TRAP --Port Down due to Admin Status down");
trapMap.put("errorStatus", "0");
trapMap.put("IPAddress", "10.127.34.219");
Когда мы вычисляем выражение с использованием MVEL.eval(), он либо терпит неудачу, либо возвращает False. Ниже приведено выражение MVEL и его результат.
System.out.println("----------########### = "+(MVEL.eval("1.3.6.1.4.1.9.9.311.1.1.2.1.19 == '0'", trapMap)));
//Throws error as
//Exception in thread "main" [Error: invalid number literal: 1.3.6.1.4.1.9.9.311.1.1.2.1.19]
// [Near : {... 1.3.6.1.4.1.9.9.311.1.1.2.1.19 == '0 ....}]
System.out.println("----------########### = "+(MVEL.eval("\"1.3.6.1.4.1.9.9.311.1.1.2.1.19\" == '0'", trapMap)));
//Enclosed trap OID in double quotes and compared with String value then it returns false
System.out.println("----------########### = "+(MVEL.eval("\"1.3.6.1.4.1.9.9.311.1.1.2.1.19\" == 0", trapMap)));
//Enclosed trap OID in double quotes and compared with number then it returns false
Наша карта всегда будет содержать такие OID и значения, и мы хотим проверить их значения с помощью MVEL. Исходя из этого, нам нужно знать
DOT(.)
Создаст проблему в выражении выше. MVEL
внутренне вызывает getter
после каждого .
property
.
мы можем заменить .
с оператором _
. Также необходимо добавить _
в начало.
public static void main(String args[]) throws Exception {
String s = "1.3.6.1.4.1.9.9.311.1.1.2.1.19 == 0";
Map<String, String> trapMap = new HashMap();
trapMap.put(convertDot("1.3.6.1.4.1.9.9.311.1.1.2.1.3"), "(7362915) 20:27:09.15");
trapMap.put(convertDot("1.3.6.1.4.1.9.9.311.1.1.2.1.2"), "2.2");
trapMap.put(convertDot("1.3.6.1.4.1.9.9.311.1.1.2.1.19"), "0");
trapMap.put(convertDot("1.3.6.1.4.1.9.9.311.1.1.2.1.16"), "SIMPLE TRAP --Port Down due to Admin Status down");
trapMap.put("errorStatus", "0");
trapMap.put("IPAddress", "10.127.34.219");
System.out.println(MVEL.eval(convertDot(s), trapMap));
}
public static String convertDot(String input) {
input = "_" + input.replaceAll("\\.", "_");
return input;
}
вывод
true
Если вы используете Java Map, вы можете неявно вызвать метод get. Следующий код будет оценивать правильное выражение.
System.out.println("----------########### = "+(MVEL.eval("get(\"1.3.6.1.4.1.9.9.311.1.1.2.1.19\") == '0'", trapMap)));