static void buildTransformation(
      ModelVersion version, ResourceTransformationDescriptionBuilder parent) {
    ResourceTransformationDescriptionBuilder builder =
        InfinispanModel.VERSION_4_0_0.requiresTransformation(version)
            ? parent.addChildRedirection(PATH, LEGACY_PATH)
            : parent.addChildResource(PATH);

    if (InfinispanModel.VERSION_4_0_0.requiresTransformation(version)) {
      builder
          .getAttributeBuilder()
          .setValueConverter(
              new AttributeConverter.DefaultAttributeConverter() {
                @Override
                protected void convertAttribute(
                    PathAddress address,
                    String attributeName,
                    ModelNode attributeValue,
                    TransformationContext context) {
                  if (attributeValue.isDefined()) {
                    List<ModelNode> remoteServers = attributeValue.clone().asList();
                    ModelNode legacyListObject = new ModelNode();
                    for (ModelNode server : remoteServers) {
                      ModelNode legacyListItem = new ModelNode();
                      legacyListItem.get("outbound-socket-binding").set(server);
                      legacyListObject.add(legacyListItem);
                    }
                    attributeValue.set(legacyListObject);
                  }
                }
              },
              Attribute.SOCKET_BINDINGS.getDefinition());
    }

    if (InfinispanModel.VERSION_3_0_0.requiresTransformation(version)) {
      builder
          .addOperationTransformationOverride(ModelDescriptionConstants.ADD)
          .setCustomOperationTransformer(
              new SimpleOperationTransformer(new LegacyPropertyAddOperationTransformer()))
          .inheritResourceAttributeDefinitions();

      builder.setCustomResourceTransformer(new LegacyPropertyResourceTransformer());
    }

    StoreResourceDefinition.buildTransformation(version, builder);
  }
  static void buildTransformation(
      ModelVersion version, ResourceTransformationDescriptionBuilder parent) {
    ResourceTransformationDescriptionBuilder builder =
        InfinispanModel.VERSION_4_0_0.requiresTransformation(version)
            ? parent.addChildRedirection(PATH, LEGACY_PATH)
            : parent.addChildResource(PATH);

    if (InfinispanModel.VERSION_4_0_0.requiresTransformation(version)) {
      builder.setCustomResourceTransformer(
          new ResourceTransformer() {
            @Override
            public void transformResource(
                ResourceTransformationContext context, PathAddress address, Resource resource)
                throws OperationFailedException {
              final ModelNode model = resource.getModel();

              final ModelNode binaryTableModel =
                  Resource.Tools.readModel(
                      resource.removeChild(BinaryTableResourceDefinition.PATH));
              if (binaryTableModel != null && binaryTableModel.isDefined()) {
                model
                    .get(DeprecatedAttribute.TABLE.getDefinition().getName())
                    .set(binaryTableModel);
              }

              final ModelNode properties =
                  model.remove(
                      StoreResourceDefinition.Attribute.PROPERTIES.getDefinition().getName());
              final ResourceTransformationContext childContext =
                  context.addTransformedResource(PathAddress.EMPTY_ADDRESS, resource);

              LegacyPropertyResourceTransformer.transformPropertiesToChildrenResources(
                  properties, address, childContext);

              context.processChildren(resource);
            }
          });
    }

    BinaryTableResourceDefinition.buildTransformation(version, builder);

    JDBCStoreResourceDefinition.buildTransformation(version, builder);
  }