@Test public void testParseBind() throws Exception { Function f = FunctionFactory.parse(new ConfigThingy("BIND", "FUNCTION (SUM(\"1\" \"1\"))"), funcLib, dialogLib, context); assertTrue(f instanceof BindFunction); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory.parse(new ConfigThingy("BIND", "\"abc\""), funcLib, dialogLib, context)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory.parse(new ConfigThingy("BIND", "FUNCTION()"), funcLib, dialogLib, context)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory.parse(new ConfigThingy("BIND", "FUNCTION(\"abc\" \"def\")"), funcLib, dialogLib, context)); assertThrows(ConfigurationErrorException.class, () -> FunctionFactory.parse(new ConfigThingy("BIND", "FUNCTION \"abc\""), funcLib, dialogLib, context)); }
private static Function parseBIND(ConfigThingy conf, FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context) { ConfigThingy funcConf = conf.query("FUNCTION"); if (funcConf.count() != 1) throw new ConfigurationErrorException( L.m("Funktion vom Typ \"BIND\" erfordert genau 1 Unterelement FUNCTION")); Function func; funcConf = funcConf.iterator().next(); if (funcConf.count() == 0) throw new ConfigurationErrorException( L.m("Bei Funktionen vom Typ \"BIND\" muss nach \"FUNCTION\" ein Funktionsname oder eine Funktion folgen.")); if (funcConf.count() > 1) throw new ConfigurationErrorException( L.m("Bei Funktionen vom Typ \"BIND\" darf nach \"FUNCTION\" keine Liste sondern nur ein Funktionsname oder eine Funktion folgen.")); funcConf = funcConf.iterator().next(); if (funcConf.count() == 0) { String funcName = funcConf.toString(); func = funcLib.get(funcName); if (func == null) throw new ConfigurationErrorException(L.m( "Funktion \"%1\" wird verwendet, bevor sie definiert ist", funcName)); } else { func = parse(funcConf, funcLib, dialogLib, context); } return new BindFunction(func, conf, funcLib, dialogLib, context); }
FunctionFactory { private static Function parseBIND(ConfigThingy conf, FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context) { ConfigThingy funcConf = conf.query("FUNCTION"); if (funcConf.count() != 1) throw new ConfigurationErrorException( L.m("Funktion vom Typ \"BIND\" erfordert genau 1 Unterelement FUNCTION")); Function func; funcConf = funcConf.iterator().next(); if (funcConf.count() == 0) throw new ConfigurationErrorException( L.m("Bei Funktionen vom Typ \"BIND\" muss nach \"FUNCTION\" ein Funktionsname oder eine Funktion folgen.")); if (funcConf.count() > 1) throw new ConfigurationErrorException( L.m("Bei Funktionen vom Typ \"BIND\" darf nach \"FUNCTION\" keine Liste sondern nur ein Funktionsname oder eine Funktion folgen.")); funcConf = funcConf.iterator().next(); if (funcConf.count() == 0) { String funcName = funcConf.toString(); func = funcLib.get(funcName); if (func == null) throw new ConfigurationErrorException(L.m( "Funktion \"%1\" wird verwendet, bevor sie definiert ist", funcName)); } else { func = parse(funcConf, funcLib, dialogLib, context); } return new BindFunction(func, conf, funcLib, dialogLib, context); } }
FunctionFactory { private static Function parseBIND(ConfigThingy conf, FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context) { ConfigThingy funcConf = conf.query("FUNCTION"); if (funcConf.count() != 1) throw new ConfigurationErrorException( L.m("Funktion vom Typ \"BIND\" erfordert genau 1 Unterelement FUNCTION")); Function func; funcConf = funcConf.iterator().next(); if (funcConf.count() == 0) throw new ConfigurationErrorException( L.m("Bei Funktionen vom Typ \"BIND\" muss nach \"FUNCTION\" ein Funktionsname oder eine Funktion folgen.")); if (funcConf.count() > 1) throw new ConfigurationErrorException( L.m("Bei Funktionen vom Typ \"BIND\" darf nach \"FUNCTION\" keine Liste sondern nur ein Funktionsname oder eine Funktion folgen.")); funcConf = funcConf.iterator().next(); if (funcConf.count() == 0) { String funcName = funcConf.toString(); func = funcLib.get(funcName); if (func == null) throw new ConfigurationErrorException(L.m( "Funktion \"%1\" wird verwendet, bevor sie definiert ist", funcName)); } else { func = parse(funcConf, funcLib, dialogLib, context); } return new BindFunction(func, conf, funcLib, dialogLib, context); } private  FunctionFactory(); }
FunctionFactory { private static Function parseBIND(ConfigThingy conf, FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context) { ConfigThingy funcConf = conf.query("FUNCTION"); if (funcConf.count() != 1) throw new ConfigurationErrorException( L.m("Funktion vom Typ \"BIND\" erfordert genau 1 Unterelement FUNCTION")); Function func; funcConf = funcConf.iterator().next(); if (funcConf.count() == 0) throw new ConfigurationErrorException( L.m("Bei Funktionen vom Typ \"BIND\" muss nach \"FUNCTION\" ein Funktionsname oder eine Funktion folgen.")); if (funcConf.count() > 1) throw new ConfigurationErrorException( L.m("Bei Funktionen vom Typ \"BIND\" darf nach \"FUNCTION\" keine Liste sondern nur ein Funktionsname oder eine Funktion folgen.")); funcConf = funcConf.iterator().next(); if (funcConf.count() == 0) { String funcName = funcConf.toString(); func = funcLib.get(funcName); if (func == null) throw new ConfigurationErrorException(L.m( "Funktion \"%1\" wird verwendet, bevor sie definiert ist", funcName)); } else { func = parse(funcConf, funcLib, dialogLib, context); } return new BindFunction(func, conf, funcLib, dialogLib, context); } 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 parseBIND(ConfigThingy conf, FunctionLibrary funcLib, DialogLibrary dialogLib, Map<Object, Object> context) { ConfigThingy funcConf = conf.query("FUNCTION"); if (funcConf.count() != 1) throw new ConfigurationErrorException( L.m("Funktion vom Typ \"BIND\" erfordert genau 1 Unterelement FUNCTION")); Function func; funcConf = funcConf.iterator().next(); if (funcConf.count() == 0) throw new ConfigurationErrorException( L.m("Bei Funktionen vom Typ \"BIND\" muss nach \"FUNCTION\" ein Funktionsname oder eine Funktion folgen.")); if (funcConf.count() > 1) throw new ConfigurationErrorException( L.m("Bei Funktionen vom Typ \"BIND\" darf nach \"FUNCTION\" keine Liste sondern nur ein Funktionsname oder eine Funktion folgen.")); funcConf = funcConf.iterator().next(); if (funcConf.count() == 0) { String funcName = funcConf.toString(); func = funcLib.get(funcName); if (func == null) throw new ConfigurationErrorException(L.m( "Funktion \"%1\" wird verwendet, bevor sie definiert ist", funcName)); } else { func = parse(funcConf, funcLib, dialogLib, context); } return new BindFunction(func, conf, funcLib, dialogLib, context); } 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);  }