/**
   * Implementation of abstract method processModelNode suitable for distributed cache
   *
   * @param cache
   * @param configuration
   * @param dependencies
   * @return
   */
  @Override
  void processModelNode(
      String containerName,
      ModelNode cache,
      ConfigurationBuilder builder,
      List<Dependency<?>> dependencies) {
    // process the basic clustered configuration
    super.processModelNode(containerName, cache, builder, dependencies);

    // process the additional distributed attributes and elements
    if (cache.hasDefined(ModelKeys.OWNERS)) {
      builder.clustering().hash().numOwners(cache.get(ModelKeys.OWNERS).asInt());
    }
    if (cache.hasDefined(ModelKeys.VIRTUAL_NODES)) {
      builder.clustering().hash().numVirtualNodes(cache.get(ModelKeys.VIRTUAL_NODES).asInt());
    }
    if (cache.hasDefined(ModelKeys.L1_LIFESPAN)) {
      long lifespan = cache.get(ModelKeys.L1_LIFESPAN).asLong();
      if (lifespan > 0) {
        builder.clustering().l1().lifespan(lifespan);
      } else {
        builder.clustering().l1().disable();
      }
    }
  }
  @Override
  void populate(ModelNode fromModel, ModelNode toModel) {
    super.populate(fromModel, toModel);

    if (fromModel.hasDefined(ModelKeys.OWNERS)) {
      toModel.get(ModelKeys.OWNERS).set(fromModel.get(ModelKeys.OWNERS));
    }
    if (fromModel.hasDefined(ModelKeys.VIRTUAL_NODES)) {
      toModel.get(ModelKeys.VIRTUAL_NODES).set(fromModel.get(ModelKeys.VIRTUAL_NODES));
    }
    if (fromModel.hasDefined(ModelKeys.L1_LIFESPAN)) {
      toModel.get(ModelKeys.L1_LIFESPAN).set(fromModel.get(ModelKeys.L1_LIFESPAN));
    }
  }