private static void validateLegacyFilter(
      final KernelServices kernelServices,
      final ModelVersion modelVersion,
      final ModelNode address,
      final String filterExpression)
      throws OperationFailedException {
    ModelNode op = Operations.createReadResourceOperation(address);
    ModelNode result = executeTransformOperation(kernelServices, modelVersion, op);
    // No filter-spec should be there
    Assert.assertFalse(
        "filter-spec found at: " + address.asString(),
        result.has(CommonAttributes.FILTER_SPEC.getName()));

    op = Operations.createReadAttributeOperation(address, CommonAttributes.FILTER);
    result = executeTransformOperation(kernelServices, modelVersion, op);
    Assert.assertEquals(
        "Transformed spec does not match filter expression.",
        Filters.filterToFilterSpec(Operations.readResult(result)),
        filterExpression);
  }
  @Test
  public void testTransformers_1_1() throws Exception {
    final String subsystemXml = getSubsystemXml();
    final ModelVersion modelVersion = ModelVersion.create(1, 1, 0);
    final KernelServicesBuilder builder =
        createKernelServicesBuilder(LoggingTestEnvironment.getManagementInstance())
            .setSubsystemXml(subsystemXml);

    // which is why we need to include the jboss-as-controller artifact.
    builder
        .createLegacyKernelServicesBuilder(
            LoggingTestEnvironment.getManagementInstance(), modelVersion)
        .addMavenResourceURL("org.jboss.as:jboss-as-logging:7.1.2.Final")
        .addMavenResourceURL("org.jboss.as:jboss-as-controller:7.1.2.Final")
        .addParentFirstClassPattern("org.jboss.as.controller.*");

    KernelServices mainServices = builder.build();
    Assert.assertTrue(mainServices.isSuccessfulBoot());
    Assert.assertTrue(mainServices.getLegacyServices(modelVersion).isSuccessfulBoot());

    final ModelNode legacyModel = checkSubsystemModelTransformation(mainServices, modelVersion);

    final PathAddress consoleAddress =
        PathAddress.pathAddress(
            LoggingTestEnvironment.SUBSYSTEM_PATH,
            PathElement.pathElement(CommonAttributes.CONSOLE_HANDLER, "CONSOLE"));
    // Get all the console handler
    final ModelNode consoleHandler =
        legacyModel.get(
            consoleAddress.getElement(0).getKey(),
            consoleAddress.getElement(0).getValue(),
            consoleAddress.getElement(1).getKey(),
            consoleAddress.getElement(1).getValue());
    String formatPattern = consoleHandler.get(CommonAttributes.FORMATTER.getName()).asString();
    Assert.assertFalse(
        "Pattern ("
            + formatPattern
            + ") contains a color attribute not supported in legacy models.",
        COLOR_PATTERN.matcher(formatPattern).find());

    // Write a pattern with a %K{level} to ensure it gets removed
    ModelNode op =
        Operations.createWriteAttributeOperation(
            consoleAddress.toModelNode(), CommonAttributes.FORMATTER, "%K{level}" + formatPattern);
    executeTransformOperation(mainServices, modelVersion, op);
    validateLegacyFormatter(mainServices, modelVersion, consoleAddress.toModelNode());

    // Test update properties
    op =
        Operations.createOperation(
            AbstractHandlerDefinition.UPDATE_OPERATION_NAME, consoleAddress.toModelNode());
    op.get(CommonAttributes.FORMATTER.getName()).set("%K{level}" + formatPattern);
    executeTransformOperation(mainServices, modelVersion, op);
    validateLegacyFormatter(mainServices, modelVersion, consoleAddress.toModelNode());

    // Write out a filter-spec
    final String filterExpression = "not(match(\"ARJUNA\\\\d\"))";
    op =
        Operations.createWriteAttributeOperation(
            consoleAddress.toModelNode(), CommonAttributes.FILTER_SPEC, filterExpression);
    executeTransformOperation(mainServices, modelVersion, op);
    validateLegacyFilter(
        mainServices, modelVersion, consoleAddress.toModelNode(), filterExpression);

    // update-propertes on a filter spec
    op =
        Operations.createOperation(
            AbstractHandlerDefinition.UPDATE_OPERATION_NAME, consoleAddress.toModelNode());
    op.get(CommonAttributes.FILTER_SPEC.getName()).set(filterExpression);
    executeTransformOperation(mainServices, modelVersion, op);
    validateLegacyFilter(
        mainServices, modelVersion, consoleAddress.toModelNode(), filterExpression);

    final PathAddress loggerAddress =
        PathAddress.pathAddress(
            LoggingTestEnvironment.SUBSYSTEM_PATH,
            PathElement.pathElement(CommonAttributes.LOGGER, "org.jboss.as.logging"));
    // Verify the logger exists, add if it doesn't
    op = Operations.createReadResourceOperation(loggerAddress.toModelNode());
    if (!Operations.successful(mainServices.executeOperation(op))) {
      op = Operations.createAddOperation(loggerAddress.toModelNode());
      executeTransformOperation(mainServices, modelVersion, op);
    }

    // write a filter-spec
    op =
        Operations.createWriteAttributeOperation(
            loggerAddress.toModelNode(), CommonAttributes.FILTER_SPEC, filterExpression);
    executeTransformOperation(mainServices, modelVersion, op);
    validateLegacyFilter(mainServices, modelVersion, loggerAddress.toModelNode(), filterExpression);
  }
  @Test
  public void testLegacyFilters() throws Exception {
    final KernelServices kernelServices = boot();
    final String fileHandlerName = "test-file-handler";

    // add new file logger so we can track logged messages
    final File logFile = createLogFile();
    final ModelNode handlerAddress = createFileHandlerAddress(fileHandlerName).toModelNode();
    addFileHandler(
        kernelServices, null, fileHandlerName, org.jboss.logmanager.Level.TRACE, logFile, true);
    // Write legacy filters
    for (Map.Entry<String, ModelNode> entry : FilterConversionTestCase.MAP.entrySet()) {
      // Validate the write-attribute operation
      ModelNode op =
          SubsystemOperations.createWriteAttributeOperation(
              handlerAddress, CommonAttributes.FILTER, entry.getValue());
      executeOperation(kernelServices, op);
      // Read the current value
      op =
          SubsystemOperations.createReadAttributeOperation(
              handlerAddress, CommonAttributes.FILTER_SPEC);
      String filterSpecResult =
          SubsystemOperations.readResultAsString(executeOperation(kernelServices, op));
      assertEquals(entry.getKey(), filterSpecResult);

      // Validate an add operation
      final ModelNode tempHandlerAddress = createConsoleHandlerAddress("temp").toModelNode();
      op = SubsystemOperations.createAddOperation(tempHandlerAddress);
      op.get(CommonAttributes.FILTER.getName()).set(entry.getValue());
      executeOperation(kernelServices, op);
      // Read the current value
      op =
          SubsystemOperations.createReadAttributeOperation(
              tempHandlerAddress, CommonAttributes.FILTER_SPEC);
      filterSpecResult =
          SubsystemOperations.readResultAsString(executeOperation(kernelServices, op));
      assertEquals(entry.getKey(), filterSpecResult);
      // Remove the temp handler
      op = SubsystemOperations.createRemoveOperation(tempHandlerAddress, true);
      executeOperation(kernelServices, op);

      // Add to a logger
      final ModelNode loggerAddress = createLoggerAddress("test-logger").toModelNode();
      op = SubsystemOperations.createAddOperation(loggerAddress);
      op.get(CommonAttributes.FILTER.getName()).set(entry.getValue());
      executeOperation(kernelServices, op);
      // Read the current value
      op =
          SubsystemOperations.createReadAttributeOperation(
              loggerAddress, CommonAttributes.FILTER_SPEC);
      filterSpecResult =
          SubsystemOperations.readResultAsString(executeOperation(kernelServices, op));
      assertEquals(entry.getKey(), filterSpecResult);

      // Remove the attribute
      op =
          SubsystemOperations.createUndefineAttributeOperation(
              loggerAddress, CommonAttributes.FILTER_SPEC);
      executeOperation(kernelServices, op);
      op = SubsystemOperations.createReadAttributeOperation(loggerAddress, CommonAttributes.FILTER);
      // Filter and filter spec should be undefined
      assertEquals(
          "Filter was not undefined",
          SubsystemOperations.UNDEFINED,
          SubsystemOperations.readResult(executeOperation(kernelServices, op)));
      op =
          SubsystemOperations.createReadAttributeOperation(
              loggerAddress, CommonAttributes.FILTER_SPEC);
      assertEquals(
          "Filter was not undefined",
          SubsystemOperations.UNDEFINED,
          SubsystemOperations.readResult(executeOperation(kernelServices, op)));

      // Test writing the attribute to the logger
      op =
          SubsystemOperations.createWriteAttributeOperation(
              loggerAddress, CommonAttributes.FILTER, entry.getValue());
      executeOperation(kernelServices, op);
      // Read the current value
      op =
          SubsystemOperations.createReadAttributeOperation(
              loggerAddress, CommonAttributes.FILTER_SPEC);
      filterSpecResult =
          SubsystemOperations.readResultAsString(executeOperation(kernelServices, op));
      assertEquals(entry.getKey(), filterSpecResult);

      // Remove the logger
      op = SubsystemOperations.createRemoveOperation(loggerAddress, true);
      executeOperation(kernelServices, op);
    }

    // Write new filters
    for (Map.Entry<String, ModelNode> entry : FilterConversionTestCase.MAP.entrySet()) {
      // Write to a handler
      ModelNode op =
          SubsystemOperations.createWriteAttributeOperation(
              handlerAddress, CommonAttributes.FILTER_SPEC, entry.getKey());
      executeOperation(kernelServices, op);
      // Read the current value
      op =
          SubsystemOperations.createReadAttributeOperation(handlerAddress, CommonAttributes.FILTER);
      ModelNode filterResult = SubsystemOperations.readResult(executeOperation(kernelServices, op));
      ModelTestUtils.compare(entry.getValue(), filterResult);

      // Validate an add operation
      final ModelNode tempHandlerAddress = createConsoleHandlerAddress("temp").toModelNode();
      op = SubsystemOperations.createAddOperation(tempHandlerAddress);
      op.get(CommonAttributes.FILTER_SPEC.getName()).set(entry.getKey());
      executeOperation(kernelServices, op);
      // Read the current value
      op =
          SubsystemOperations.createReadAttributeOperation(
              tempHandlerAddress, CommonAttributes.FILTER);
      filterResult = SubsystemOperations.readResult(executeOperation(kernelServices, op));
      ModelTestUtils.compare(entry.getValue(), filterResult);
      // Remove the temp handler
      op = SubsystemOperations.createRemoveOperation(tempHandlerAddress, true);
      executeOperation(kernelServices, op);

      // Add to a logger
      final ModelNode loggerAddress = createLoggerAddress("test-logger").toModelNode();
      op = SubsystemOperations.createAddOperation(loggerAddress);
      op.get(CommonAttributes.FILTER_SPEC.getName()).set(entry.getKey());
      executeOperation(kernelServices, op);
      // Read the current value
      op = SubsystemOperations.createReadAttributeOperation(loggerAddress, CommonAttributes.FILTER);
      filterResult = SubsystemOperations.readResult(executeOperation(kernelServices, op));
      ModelTestUtils.compare(entry.getValue(), filterResult);

      // Test writing the attribute to the logger
      op =
          SubsystemOperations.createWriteAttributeOperation(
              loggerAddress, CommonAttributes.FILTER_SPEC, entry.getKey());
      executeOperation(kernelServices, op);
      // Read the current value
      op = SubsystemOperations.createReadAttributeOperation(loggerAddress, CommonAttributes.FILTER);
      filterResult = SubsystemOperations.readResult(executeOperation(kernelServices, op));
      ModelTestUtils.compare(entry.getValue(), filterResult);

      // Remove the logger
      op = SubsystemOperations.createRemoveOperation(loggerAddress, true);
      executeOperation(kernelServices, op);
    }
    removeFileHandler(kernelServices, null, fileHandlerName, true);
  }