public void parseCommandLine(String buffer) throws CommandFormatException {
   try {
     parsedCmd.parse(prefix, buffer);
   } catch (CommandFormatException e) {
     if (!parsedCmd.endsOnAddressOperationNameSeparator() || !parsedCmd.endsOnSeparator()) {
       throw e;
     }
   }
 }
 protected Operation parseExpression(String condition) throws CommandFormatException {
   LINE.parse(ADDRESS, "if " + condition + " of /a=b:c", CTX);
   return CONDITION.resolveOperation(LINE);
 }
  @Test
  public void testRolloutIdWithValue() throws Exception {

    parse(":do{ rollout id = myplan}");

    assertFalse(handler.hasAddress());
    assertTrue(handler.hasOperationName());
    assertFalse(handler.hasProperties());
    assertFalse(handler.endsOnAddressOperationNameSeparator());
    assertFalse(handler.endsOnPropertyListStart());
    assertFalse(handler.endsOnPropertySeparator());
    assertFalse(handler.endsOnPropertyValueSeparator());
    assertFalse(handler.endsOnNodeSeparator());
    assertFalse(handler.endsOnNodeTypeNameSeparator());
    assertFalse(handler.endsOnSeparator());
    assertFalse(handler.endsOnHeaderListStart());
    assertTrue(handler.isRequestComplete());
    assertTrue(handler.hasHeaders());

    final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
    assertEquals(1, headers.size());
    final ParsedOperationRequestHeader header = headers.iterator().next();
    assertTrue(header instanceof ParsedRolloutPlanHeader);

    final ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
    assertEquals("myplan", rollout.getPlanRef());
    assertEquals(18, rollout.getLastChunkIndex());
  }
 protected void parse(String input) throws OperationFormatException {
   callback.reset();
   parser.parse(input, callback);
 }
  @Test
  public void testSingleHeader() throws Exception {

    parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ name = value }");

    assertTrue(handler.hasAddress());
    assertTrue(handler.hasOperationName());
    assertFalse(handler.hasProperties());
    assertFalse(handler.endsOnAddressOperationNameSeparator());
    assertFalse(handler.endsOnPropertyListStart());
    assertFalse(handler.endsOnPropertySeparator());
    assertFalse(handler.endsOnPropertyValueSeparator());
    assertFalse(handler.endsOnNodeSeparator());
    assertFalse(handler.endsOnNodeTypeNameSeparator());
    assertFalse(handler.endsOnSeparator());
    assertFalse(handler.endsOnHeaderListStart());
    assertTrue(handler.isRequestComplete());
    assertTrue(handler.hasHeaders());

    final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
    assertEquals(1, headers.size());
    final ParsedOperationRequestHeader header = headers.iterator().next();

    assertEquals("name", header.getName());
    final ModelNode node = new ModelNode();
    node.get("name").set("value");

    final ModelNode headersNode = new ModelNode();
    header.addTo(ctx, headersNode);
    assertEquals(node, headersNode);
  }
  @Test
  public void testMixAgainstWholeRequest() throws Exception {

    parse(
        "/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout "
            + "groupA(rolling-to-servers=true,max-failure-percentage=20) ^ groupB, groupC,"
            + "groupD(rolling-to-servers=true,max-failed-servers=1) ^ groupE rollback-across-groups}");

    assertTrue(handler.hasAddress());
    assertTrue(handler.hasOperationName());
    assertFalse(handler.hasProperties());
    assertFalse(handler.endsOnAddressOperationNameSeparator());
    assertFalse(handler.endsOnPropertyListStart());
    assertFalse(handler.endsOnPropertySeparator());
    assertFalse(handler.endsOnPropertyValueSeparator());
    assertFalse(handler.endsOnNodeSeparator());
    assertFalse(handler.endsOnNodeTypeNameSeparator());
    assertFalse(handler.endsOnSeparator());
    assertFalse(handler.endsOnHeaderListStart());
    assertTrue(handler.isRequestComplete());

    assertTrue(handler.hasHeaders());

    final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
    assertEquals(1, headers.size());

    final ModelNode op = handler.toOperationRequest(ctx);
    assertTrue(op.hasDefined(Util.OPERATION_HEADERS));
    final ModelNode headersNode = op.get(Util.OPERATION_HEADERS);

    final ModelNode expectedHeaders = new ModelNode();
    final ModelNode rolloutPlan = expectedHeaders.get(Util.ROLLOUT_PLAN);
    final ModelNode inSeries = rolloutPlan.get(Util.IN_SERIES);

    ModelNode concurrent = new ModelNode();
    ModelNode cg = concurrent.get(Util.CONCURRENT_GROUPS);

    ModelNode group = cg.get("groupA");
    group.get("rolling-to-servers").set("true");
    group.get("max-failure-percentage").set("20");

    group = cg.get("groupB");

    inSeries.add().set(concurrent);

    ModelNode sg = new ModelNode();
    group = sg.get(Util.SERVER_GROUP);
    group.get("groupC");
    inSeries.add().set(sg);

    concurrent = new ModelNode();
    cg = concurrent.get(Util.CONCURRENT_GROUPS);

    group = cg.get("groupD");
    group.get("rolling-to-servers").set("true");
    group.get("max-failed-servers").set("1");

    cg.get("groupE");

    inSeries.add().set(concurrent);

    rolloutPlan.get("rollback-across-groups").set("true");

    assertEquals(expectedHeaders, headersNode);
  }
  @Test
  public void testTwoConcurrentGroupNames() throws Exception {

    parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout groupA ^ groupB");

    assertTrue(handler.hasAddress());
    assertTrue(handler.hasOperationName());
    assertFalse(handler.hasProperties());
    assertFalse(handler.endsOnAddressOperationNameSeparator());
    assertFalse(handler.endsOnPropertyListStart());
    assertFalse(handler.endsOnPropertySeparator());
    assertFalse(handler.endsOnPropertyValueSeparator());
    assertFalse(handler.endsOnNodeSeparator());
    assertFalse(handler.endsOnNodeTypeNameSeparator());
    assertFalse(handler.endsOnSeparator());
    assertFalse(handler.endsOnHeaderListStart());
    assertFalse(handler.isRequestComplete());

    assertTrue(handler.hasHeaders());

    final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
    assertEquals(1, headers.size());
    final ParsedOperationRequestHeader header = headers.iterator().next();
    assertTrue(header instanceof ParsedRolloutPlanHeader);

    final ModelNode node = new ModelNode();
    final ModelNode inSeries = node.get(Util.ROLLOUT_PLAN).get(Util.IN_SERIES);

    final ModelNode concurrent = new ModelNode();
    final ModelNode cg = concurrent.get(Util.CONCURRENT_GROUPS);
    cg.get("groupA");
    cg.get("groupB");

    inSeries.add().set(concurrent);

    final ModelNode headersNode = new ModelNode();
    header.addTo(ctx, headersNode);
    assertEquals(node, headersNode);
  }
  @Test
  public void testMix() throws Exception {

    parse(
        "/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout "
            + "groupA(rolling-to-servers=true,max-failure-percentage=20) ^ groupB, groupC,"
            + "groupD(rolling-to-servers=true,max-failed-servers=1) ^ groupE");

    assertTrue(handler.hasAddress());
    assertTrue(handler.hasOperationName());
    assertFalse(handler.hasProperties());
    assertFalse(handler.endsOnAddressOperationNameSeparator());
    assertFalse(handler.endsOnPropertyListStart());
    assertFalse(handler.endsOnPropertySeparator());
    assertFalse(handler.endsOnPropertyValueSeparator());
    assertFalse(handler.endsOnNodeSeparator());
    assertFalse(handler.endsOnNodeTypeNameSeparator());
    assertFalse(handler.endsOnSeparator());
    assertFalse(handler.endsOnHeaderListStart());
    assertFalse(handler.isRequestComplete());

    assertTrue(handler.hasHeaders());

    final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
    assertEquals(1, headers.size());
    final ParsedOperationRequestHeader header = headers.iterator().next();
    assertTrue(header instanceof ParsedRolloutPlanHeader);

    final ModelNode node = new ModelNode();
    final ModelNode inSeries = node.get(Util.ROLLOUT_PLAN).get(Util.IN_SERIES);

    ModelNode concurrent = new ModelNode();
    ModelNode cg = concurrent.get(Util.CONCURRENT_GROUPS);

    ModelNode group = cg.get("groupA");
    group.get("rolling-to-servers").set("true");
    group.get("max-failure-percentage").set("20");

    group = cg.get("groupB");

    inSeries.add().set(concurrent);

    ModelNode sg = new ModelNode();
    group = sg.get(Util.SERVER_GROUP);
    group.get("groupC");
    inSeries.add().set(sg);

    concurrent = new ModelNode();
    cg = concurrent.get(Util.CONCURRENT_GROUPS);

    group = cg.get("groupD");
    group.get("rolling-to-servers").set("true");
    group.get("max-failed-servers").set("1");

    group = cg.get("groupE");

    inSeries.add().set(concurrent);

    final ModelNode headersNode = new ModelNode();
    header.addTo(ctx, headersNode);
    assertEquals(node, headersNode);
  }
  @Test
  public void testEndsOnGroupConcurrent() throws Exception {

    parse(":do{ rollout groupA( prop = v ) ^");

    assertFalse(handler.hasAddress());
    assertTrue(handler.hasOperationName());
    assertFalse(handler.hasProperties());
    assertFalse(handler.endsOnAddressOperationNameSeparator());
    assertFalse(handler.endsOnPropertyListStart());
    assertFalse(handler.endsOnPropertySeparator());
    assertFalse(handler.endsOnPropertyValueSeparator());
    assertFalse(handler.endsOnNodeSeparator());
    assertFalse(handler.endsOnNodeTypeNameSeparator());
    assertFalse(handler.endsOnSeparator());
    assertFalse(handler.endsOnHeaderListStart());
    assertFalse(handler.isRequestComplete());

    assertTrue(handler.hasHeaders());

    final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
    assertEquals(1, headers.size());
    final ParsedOperationRequestHeader header = headers.iterator().next();
    assertTrue(header instanceof ParsedRolloutPlanHeader);
    final ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
    assertTrue(rollout.endsOnGroupSeparator());
    assertEquals(32, rollout.getLastSeparatorIndex());
  }
  @Test
  public void testEmptyHeaders() throws Exception {

    parse("/profile=default/subsystem=threads/thread-factory=mytf:do{}");

    assertTrue(handler.hasAddress());
    assertTrue(handler.hasOperationName());
    assertFalse(handler.hasProperties());
    assertFalse(handler.endsOnAddressOperationNameSeparator());
    assertFalse(handler.endsOnPropertyListStart());
    assertFalse(handler.endsOnPropertySeparator());
    assertFalse(handler.endsOnPropertyValueSeparator());
    assertFalse(handler.endsOnNodeSeparator());
    assertFalse(handler.endsOnNodeTypeNameSeparator());
    assertFalse(handler.endsOnSeparator());
    assertFalse(handler.endsOnHeaderListStart());
    assertTrue(handler.isRequestComplete());
    assertFalse(handler.hasHeaders());
  }
  @Test
  public void testRolloutSingleGroupWithProps() throws Exception {

    // parse("/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout
    // in-series=groupA(rolling-to-servers=true,max-failure-percentage=20)");
    parse(
        "/profile=default/subsystem=threads/thread-factory=mytf:do{ rollout groupA(rolling-to-servers=true,max-failure-percentage=20)");

    assertTrue(handler.hasAddress());
    assertTrue(handler.hasOperationName());
    assertFalse(handler.hasProperties());
    assertFalse(handler.endsOnAddressOperationNameSeparator());
    assertFalse(handler.endsOnPropertyListStart());
    assertFalse(handler.endsOnPropertySeparator());
    assertFalse(handler.endsOnPropertyValueSeparator());
    assertFalse(handler.endsOnNodeSeparator());
    assertFalse(handler.endsOnNodeTypeNameSeparator());
    assertFalse(handler.endsOnSeparator());
    assertFalse(handler.endsOnHeaderListStart());
    assertFalse(handler.isRequestComplete());

    assertTrue(handler.hasHeaders());

    final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
    assertEquals(1, headers.size());
    final ParsedOperationRequestHeader header = headers.iterator().next();
    assertTrue(header instanceof ParsedRolloutPlanHeader);

    final ModelNode node = new ModelNode();
    final ModelNode inSeries = node.get(Util.ROLLOUT_PLAN).get(Util.IN_SERIES);
    final ModelNode groupA = new ModelNode();
    final ModelNode groupProps = groupA.get("groupA");
    groupProps.get("rolling-to-servers").set("true");
    groupProps.get("max-failure-percentage").set("20");
    inSeries.add().get(Util.SERVER_GROUP).set(groupA);

    final ModelNode headersNode = new ModelNode();
    header.addTo(ctx, headersNode);
    assertEquals(node, headersNode);
  }
  @Test
  public void testEndsOnGroupPropertySeparator() throws Exception {

    parse(":do{ rollout groupA( prop = v,");

    assertFalse(handler.hasAddress());
    assertTrue(handler.hasOperationName());
    assertFalse(handler.hasProperties());
    assertFalse(handler.endsOnAddressOperationNameSeparator());
    assertFalse(handler.endsOnPropertyListStart());
    assertFalse(handler.endsOnPropertySeparator());
    assertFalse(handler.endsOnPropertyValueSeparator());
    assertFalse(handler.endsOnNodeSeparator());
    assertFalse(handler.endsOnNodeTypeNameSeparator());
    assertFalse(handler.endsOnSeparator());
    assertFalse(handler.endsOnHeaderListStart());
    assertFalse(handler.isRequestComplete());

    assertTrue(handler.hasHeaders());

    final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
    assertEquals(1, headers.size());
    final ParsedOperationRequestHeader header = headers.iterator().next();
    assertTrue(header instanceof ParsedRolloutPlanHeader);
    ParsedRolloutPlanHeader rollout = (ParsedRolloutPlanHeader) header;
    final SingleRolloutPlanGroup group = rollout.getLastGroup();
    assertNotNull(group);

    assertEquals("groupA", group.getGroupName());
    assertFalse(group.endsOnPropertyListStart());
    assertFalse(group.endsOnPropertyListEnd());
    assertTrue(group.hasProperties());
    assertFalse(group.endsOnPropertyValueSeparator());
    assertNull(group.getLastPropertyName());
    assertNull(group.getLastPropertyValue());

    assertTrue(group.endsOnPropertySeparator());
    assertEquals(29, group.getLastSeparatorIndex());
  }
 protected void parse(String opReq) throws CommandFormatException {
   handler.reset();
   parser.parse(opReq, handler);
 }
  @Test
  public void testOnlyHeaderListStart() throws Exception {

    parse("{");

    assertFalse(handler.hasAddress());
    assertFalse(handler.hasOperationName());
    assertFalse(handler.hasProperties());
    assertFalse(handler.endsOnAddressOperationNameSeparator());
    assertFalse(handler.endsOnPropertyListStart());
    assertFalse(handler.endsOnPropertySeparator());
    assertFalse(handler.endsOnPropertyValueSeparator());
    assertFalse(handler.endsOnNodeSeparator());
    assertFalse(handler.endsOnNodeTypeNameSeparator());
    assertTrue(handler.endsOnSeparator());
    assertTrue(handler.endsOnHeaderListStart());
    assertFalse(handler.isRequestComplete());
    assertFalse(handler.hasHeaders());
  }
  @Test
  public void testRollout() throws Exception {

    parse(":do{rollout");

    assertFalse(handler.hasAddress());
    assertTrue(handler.hasOperationName());
    assertFalse(handler.hasProperties());
    assertFalse(handler.endsOnAddressOperationNameSeparator());
    assertFalse(handler.endsOnPropertyListStart());
    assertFalse(handler.endsOnPropertySeparator());
    assertFalse(handler.endsOnPropertyValueSeparator());
    assertFalse(handler.endsOnNodeSeparator());
    assertFalse(handler.endsOnNodeTypeNameSeparator());
    assertFalse(handler.endsOnSeparator());
    assertFalse(handler.endsOnHeaderListStart());
    assertFalse(handler.isRequestComplete());
    assertTrue(handler.hasHeaders());

    final Collection<ParsedOperationRequestHeader> headers = handler.getHeaders();
    assertEquals(0, headers.size());
    assertEquals("rollout", handler.getLastHeaderName());
  }