@Test public void testParseDivide() throws Exception { assertThrows(ConfigurationErrorException.class, () -> FunctionFactory.parse(new ConfigThingy("DIVIDE", "\"10\" BY(\"1\", \"2\")"), funcLib, dialogLib, null)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory.parse(new ConfigThingy("DIVIDE", "\"10\" BY \"1\" BY \"2\""), funcLib, dialogLib, null)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory .parse(new ConfigThingy("DIVIDE", "\"10\" BY \"1\" MAX \"-1\""), funcLib, dialogLib, null)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory .parse(new ConfigThingy("DIVIDE", "\"10\" BY \"1\" MAX \"abc\""), funcLib, dialogLib, null)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory .parse(new ConfigThingy("DIVIDE", "\"10\" BY \"1\" MAX (abc(\"1\"))"), funcLib, dialogLib, null)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory.parse(new ConfigThingy("DIVIDE", "\"10\" BY \"1\""), funcLib, dialogLib, null)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory .parse(new ConfigThingy("DIVIDE", "\"10\" BY \"1\" MIN \"-1\""), funcLib, dialogLib, null)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory .parse(new ConfigThingy("DIVIDE", "\"10\" BY \"1\" MIN \"abc\""), funcLib, dialogLib, null)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory .parse(new ConfigThingy("DIVIDE", "\"10\" BY \"1\" MIN (abc(\"1\"))"), funcLib, dialogLib, null)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory .parse(new ConfigThingy("DIVIDE", "\"10\" BY \"1\" MAX \"1\" MIN (\"2\")"), funcLib, dialogLib, null)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory .parse(new ConfigThingy("DIVIDE", "\"10\" \"5\" BY \"1\" MAX \"2\""), funcLib, dialogLib, null)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory.parse(new ConfigThingy("DIVIDE", "BY \"1\" MAX \"2\""), funcLib, dialogLib, null)); }
private static Function parseDIVIDE(ConfigThingy conf, FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context) { Function dividendFun = null; Function byFun = null; int minScale = 0; int maxScale = -1; for (ConfigThingy funConf : conf) { String name = funConf.getName(); if (name.equals("BY")) { if (funConf.count() != 1) { throw new ConfigurationErrorException(L.m( "BY-Angabe von %1 muss genau eine Funktion oder einen String enthalten", conf.getName())); } if (byFun != null) { throw new ConfigurationErrorException(L.m( "%1-Funktion darf maximal eine BY-Angabe haben", conf.getName())); } byFun = parseChildren(funConf, funcLib, dialogLib, context); } else if (name.equals("MIN")) { int num = -1; try { if (funConf.getFirstChild().count() == 0) { num = Integer.parseInt(funConf.toString()); } } catch (Exception x) { LOGGER.trace("", x); } if (num < 0) { throw new ConfigurationErrorException(L.m( "MIN-Angabe von %1 muss \"<NichtNegativeGanzeZahl>\" sein", conf.getName())); } minScale = num; } else if (name.equals("MAX")) { int num = -1; try { if (funConf.getFirstChild().count() == 0) { num = Integer.parseInt(funConf.toString()); } } catch (Exception x) { LOGGER.trace("", x); } if (num < 0) { throw new ConfigurationErrorException(L.m( "MAX-Angabe von %1 muss \"<NichtNegativeGanzeZahl>\" sein", conf.getName())); } maxScale = num; } else { if (dividendFun != null) { throw new ConfigurationErrorException( L.m( "Bei %1-Funktion wurde mehr als eine unqualifizierte Funktion angegeben. Beachten Sie, dass der Divisor mit BY(...) umschlossen sein muss.", conf.getName())); } dividendFun = parse(funConf, funcLib, dialogLib, context); } } if (dividendFun == null) { throw new ConfigurationErrorException(L.m( "Bei %1-Funktion muss genau eine unqualifizierte Funktion angegeben werden", conf.getName())); } if (maxScale < 0) { if (byFun == null) { maxScale = 1024; } else { throw new ConfigurationErrorException( L.m( "%1 erfordert die Angabe MAX \"<NichtNegativeZahl>\", wenn mit BY ein Divisor angegeben wird", conf.getName())); } } if (maxScale < minScale) { throw new ConfigurationErrorException(L.m( "Bei %1 muss MIN kleiner oder gleich MAX sein", conf.getName())); } return new DivideFunction(dividendFun, byFun, minScale, maxScale); }
FunctionFactory { private static Function parseDIVIDE(ConfigThingy conf, FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context) { Function dividendFun = null; Function byFun = null; int minScale = 0; int maxScale = -1; for (ConfigThingy funConf : conf) { String name = funConf.getName(); if (name.equals("BY")) { if (funConf.count() != 1) { throw new ConfigurationErrorException(L.m( "BY-Angabe von %1 muss genau eine Funktion oder einen String enthalten", conf.getName())); } if (byFun != null) { throw new ConfigurationErrorException(L.m( "%1-Funktion darf maximal eine BY-Angabe haben", conf.getName())); } byFun = parseChildren(funConf, funcLib, dialogLib, context); } else if (name.equals("MIN")) { int num = -1; try { if (funConf.getFirstChild().count() == 0) { num = Integer.parseInt(funConf.toString()); } } catch (Exception x) { LOGGER.trace("", x); } if (num < 0) { throw new ConfigurationErrorException(L.m( "MIN-Angabe von %1 muss \"<NichtNegativeGanzeZahl>\" sein", conf.getName())); } minScale = num; } else if (name.equals("MAX")) { int num = -1; try { if (funConf.getFirstChild().count() == 0) { num = Integer.parseInt(funConf.toString()); } } catch (Exception x) { LOGGER.trace("", x); } if (num < 0) { throw new ConfigurationErrorException(L.m( "MAX-Angabe von %1 muss \"<NichtNegativeGanzeZahl>\" sein", conf.getName())); } maxScale = num; } else { if (dividendFun != null) { throw new ConfigurationErrorException( L.m( "Bei %1-Funktion wurde mehr als eine unqualifizierte Funktion angegeben. Beachten Sie, dass der Divisor mit BY(...) umschlossen sein muss.", conf.getName())); } dividendFun = parse(funConf, funcLib, dialogLib, context); } } if (dividendFun == null) { throw new ConfigurationErrorException(L.m( "Bei %1-Funktion muss genau eine unqualifizierte Funktion angegeben werden", conf.getName())); } if (maxScale < 0) { if (byFun == null) { maxScale = 1024; } else { throw new ConfigurationErrorException( L.m( "%1 erfordert die Angabe MAX \"<NichtNegativeZahl>\", wenn mit BY ein Divisor angegeben wird", conf.getName())); } } if (maxScale < minScale) { throw new ConfigurationErrorException(L.m( "Bei %1 muss MIN kleiner oder gleich MAX sein", conf.getName())); } return new DivideFunction(dividendFun, byFun, minScale, maxScale); } }
FunctionFactory { private static Function parseDIVIDE(ConfigThingy conf, FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context) { Function dividendFun = null; Function byFun = null; int minScale = 0; int maxScale = -1; for (ConfigThingy funConf : conf) { String name = funConf.getName(); if (name.equals("BY")) { if (funConf.count() != 1) { throw new ConfigurationErrorException(L.m( "BY-Angabe von %1 muss genau eine Funktion oder einen String enthalten", conf.getName())); } if (byFun != null) { throw new ConfigurationErrorException(L.m( "%1-Funktion darf maximal eine BY-Angabe haben", conf.getName())); } byFun = parseChildren(funConf, funcLib, dialogLib, context); } else if (name.equals("MIN")) { int num = -1; try { if (funConf.getFirstChild().count() == 0) { num = Integer.parseInt(funConf.toString()); } } catch (Exception x) { LOGGER.trace("", x); } if (num < 0) { throw new ConfigurationErrorException(L.m( "MIN-Angabe von %1 muss \"<NichtNegativeGanzeZahl>\" sein", conf.getName())); } minScale = num; } else if (name.equals("MAX")) { int num = -1; try { if (funConf.getFirstChild().count() == 0) { num = Integer.parseInt(funConf.toString()); } } catch (Exception x) { LOGGER.trace("", x); } if (num < 0) { throw new ConfigurationErrorException(L.m( "MAX-Angabe von %1 muss \"<NichtNegativeGanzeZahl>\" sein", conf.getName())); } maxScale = num; } else { if (dividendFun != null) { throw new ConfigurationErrorException( L.m( "Bei %1-Funktion wurde mehr als eine unqualifizierte Funktion angegeben. Beachten Sie, dass der Divisor mit BY(...) umschlossen sein muss.", conf.getName())); } dividendFun = parse(funConf, funcLib, dialogLib, context); } } if (dividendFun == null) { throw new ConfigurationErrorException(L.m( "Bei %1-Funktion muss genau eine unqualifizierte Funktion angegeben werden", conf.getName())); } if (maxScale < 0) { if (byFun == null) { maxScale = 1024; } else { throw new ConfigurationErrorException( L.m( "%1 erfordert die Angabe MAX \"<NichtNegativeZahl>\", wenn mit BY ein Divisor angegeben wird", conf.getName())); } } if (maxScale < minScale) { throw new ConfigurationErrorException(L.m( "Bei %1 muss MIN kleiner oder gleich MAX sein", conf.getName())); } return new DivideFunction(dividendFun, byFun, minScale, maxScale); } private  FunctionFactory(); }
FunctionFactory { private static Function parseDIVIDE(ConfigThingy conf, FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context) { Function dividendFun = null; Function byFun = null; int minScale = 0; int maxScale = -1; for (ConfigThingy funConf : conf) { String name = funConf.getName(); if (name.equals("BY")) { if (funConf.count() != 1) { throw new ConfigurationErrorException(L.m( "BY-Angabe von %1 muss genau eine Funktion oder einen String enthalten", conf.getName())); } if (byFun != null) { throw new ConfigurationErrorException(L.m( "%1-Funktion darf maximal eine BY-Angabe haben", conf.getName())); } byFun = parseChildren(funConf, funcLib, dialogLib, context); } else if (name.equals("MIN")) { int num = -1; try { if (funConf.getFirstChild().count() == 0) { num = Integer.parseInt(funConf.toString()); } } catch (Exception x) { LOGGER.trace("", x); } if (num < 0) { throw new ConfigurationErrorException(L.m( "MIN-Angabe von %1 muss \"<NichtNegativeGanzeZahl>\" sein", conf.getName())); } minScale = num; } else if (name.equals("MAX")) { int num = -1; try { if (funConf.getFirstChild().count() == 0) { num = Integer.parseInt(funConf.toString()); } } catch (Exception x) { LOGGER.trace("", x); } if (num < 0) { throw new ConfigurationErrorException(L.m( "MAX-Angabe von %1 muss \"<NichtNegativeGanzeZahl>\" sein", conf.getName())); } maxScale = num; } else { if (dividendFun != null) { throw new ConfigurationErrorException( L.m( "Bei %1-Funktion wurde mehr als eine unqualifizierte Funktion angegeben. Beachten Sie, dass der Divisor mit BY(...) umschlossen sein muss.", conf.getName())); } dividendFun = parse(funConf, funcLib, dialogLib, context); } } if (dividendFun == null) { throw new ConfigurationErrorException(L.m( "Bei %1-Funktion muss genau eine unqualifizierte Funktion angegeben werden", conf.getName())); } if (maxScale < 0) { if (byFun == null) { maxScale = 1024; } else { throw new ConfigurationErrorException( L.m( "%1 erfordert die Angabe MAX \"<NichtNegativeZahl>\", wenn mit BY ein Divisor angegeben wird", conf.getName())); } } if (maxScale < minScale) { throw new ConfigurationErrorException(L.m( "Bei %1 muss MIN kleiner oder gleich MAX sein", conf.getName())); } return new DivideFunction(dividendFun, byFun, minScale, maxScale); } private  FunctionFactory(); static Function alwaysTrueFunction(); static Function parseGrandchildren(ConfigThingy conf,
      FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context); static Function parseChildren(ConfigThingy conf, FunctionLibrary funcLib,
      DialogLibrary dialogLib, Map<Object, Object> context); static Function parse(ConfigThingy conf, FunctionLibrary funcLib,
      DialogLibrary dialogLib, Map<Object, Object> context); static FunctionLibrary parseFunctions(ConfigThingy conf,
      DialogLibrary dialogLib, Map<Object, Object> context, FunctionLibrary baselib); static FunctionLibrary parseFunctions(FunctionLibrary funcs,
      ConfigThingy conf, String section, DialogLibrary dialogLib,
      Map<Object, Object> context); static Map<String, Function> parseTrafos(ConfigThingy trafoConf, String nodeName, FunctionLibrary funcLib, DialogLibrary dialogLib,
      Map<Object, Object> context); }
FunctionFactory { private static Function parseDIVIDE(ConfigThingy conf, FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context) { Function dividendFun = null; Function byFun = null; int minScale = 0; int maxScale = -1; for (ConfigThingy funConf : conf) { String name = funConf.getName(); if (name.equals("BY")) { if (funConf.count() != 1) { throw new ConfigurationErrorException(L.m( "BY-Angabe von %1 muss genau eine Funktion oder einen String enthalten", conf.getName())); } if (byFun != null) { throw new ConfigurationErrorException(L.m( "%1-Funktion darf maximal eine BY-Angabe haben", conf.getName())); } byFun = parseChildren(funConf, funcLib, dialogLib, context); } else if (name.equals("MIN")) { int num = -1; try { if (funConf.getFirstChild().count() == 0) { num = Integer.parseInt(funConf.toString()); } } catch (Exception x) { LOGGER.trace("", x); } if (num < 0) { throw new ConfigurationErrorException(L.m( "MIN-Angabe von %1 muss \"<NichtNegativeGanzeZahl>\" sein", conf.getName())); } minScale = num; } else if (name.equals("MAX")) { int num = -1; try { if (funConf.getFirstChild().count() == 0) { num = Integer.parseInt(funConf.toString()); } } catch (Exception x) { LOGGER.trace("", x); } if (num < 0) { throw new ConfigurationErrorException(L.m( "MAX-Angabe von %1 muss \"<NichtNegativeGanzeZahl>\" sein", conf.getName())); } maxScale = num; } else { if (dividendFun != null) { throw new ConfigurationErrorException( L.m( "Bei %1-Funktion wurde mehr als eine unqualifizierte Funktion angegeben. Beachten Sie, dass der Divisor mit BY(...) umschlossen sein muss.", conf.getName())); } dividendFun = parse(funConf, funcLib, dialogLib, context); } } if (dividendFun == null) { throw new ConfigurationErrorException(L.m( "Bei %1-Funktion muss genau eine unqualifizierte Funktion angegeben werden", conf.getName())); } if (maxScale < 0) { if (byFun == null) { maxScale = 1024; } else { throw new ConfigurationErrorException( L.m( "%1 erfordert die Angabe MAX \"<NichtNegativeZahl>\", wenn mit BY ein Divisor angegeben wird", conf.getName())); } } if (maxScale < minScale) { throw new ConfigurationErrorException(L.m( "Bei %1 muss MIN kleiner oder gleich MAX sein", conf.getName())); } return new DivideFunction(dividendFun, byFun, minScale, maxScale); } private  FunctionFactory(); static Function alwaysTrueFunction(); static Function parseGrandchildren(ConfigThingy conf,
      FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context); static Function parseChildren(ConfigThingy conf, FunctionLibrary funcLib,
      DialogLibrary dialogLib, Map<Object, Object> context); static Function parse(ConfigThingy conf, FunctionLibrary funcLib,
      DialogLibrary dialogLib, Map<Object, Object> context); static FunctionLibrary parseFunctions(ConfigThingy conf,
      DialogLibrary dialogLib, Map<Object, Object> context, FunctionLibrary baselib); static FunctionLibrary parseFunctions(FunctionLibrary funcs,
      ConfigThingy conf, String section, DialogLibrary dialogLib,
      Map<Object, Object> context); static Map<String, Function> parseTrafos(ConfigThingy trafoConf, String nodeName, FunctionLibrary funcLib, DialogLibrary dialogLib,
      Map<Object, Object> context);  }