} else if (macroName.startsWith(Type.HOST_OF_SERVICE.prefix)) { String service = Type.HOST_OF_SERVICE.stripPrefix(macroName); checkService(service); return new HostServiceEvaluator(service, instanceNum); } else if (macroName.startsWith(Type.NUM_OF_NODES_WITH_SERVICE.prefix)) { String service = Type.NUM_OF_NODES_WITH_SERVICE.stripPrefix(macroName); checkService(service); return new ServiceCardinalityEvaluator(service); } else if (macroName.startsWith(Type.INSTANCE_OF_SERVICE.prefix)) { String service = Type.INSTANCE_OF_SERVICE.stripPrefix(macroName); checkService(service); return new ServiceInstanceEvaluator(service); } else if (macroName.startsWith(Type.IP.prefix)) {
@Test public void testParseMacroName() throws SyntaxException { Assert.assertEquals(new HostServiceEvaluator("abc", null), Evaluators.evaluatorFor("host.service.abc", null)); Assert.assertEquals(new IPServiceEvaluator("abc", "access_v4", null), Evaluators.evaluatorFor("ip.access_v4.service.abc", null)); Assert.assertEquals(new IPServiceEvaluator("abc", "bind_v4", null), Evaluators.evaluatorFor("ip.service.abc", null)); Assert.assertTrue(Evaluators.evaluatorFor("cluster.owner", null) instanceof ClusterOwnerEvaluator); for (String macro : ImmutableList.of("", "host.service.", "IP_OF_SERVICE.abc", "SERVICE_BULLSHIT_abc")) { try { Evaluators.evaluatorFor(macro, null); Assert.fail("'" + macro + "' should have thrown syntax exception."); } catch (SyntaxException e) { // expected } } } }
/** * Parse the input and return the resulting expression. * @throws SyntaxException in case of syntax errors. */ public Expression parse() throws SyntaxException { macro = null; format = null; separator = null; int pos; if (input.startsWith("join(")) { pos = parseInner(5); pos = expect(pos, ','); pos = parseSeparator(pos); pos = expect(pos, ')'); } else { pos = parseInner(0); } expectEnd(pos); if (macro == null) { throw new SyntaxException("A macro name must be present."); } Evaluator evaluator = Evaluators.evaluatorFor(macro, instanceNum); return new Expression(evaluator, format, separator); }