private ModelNode getValueTypeDescription(boolean forOperation) {
   final ModelNode result = new ModelNode();
   result.get(ModelDescriptionConstants.TYPE).set(valueType.getType());
   result.get(ModelDescriptionConstants.DESCRIPTION); // placeholder
   result.get(ModelDescriptionConstants.EXPRESSIONS_ALLOWED).set(valueType.isAllowExpression());
   if (forOperation) {
     result.get(ModelDescriptionConstants.REQUIRED).set(!valueType.isAllowNull());
   }
   result.get(ModelDescriptionConstants.NILLABLE).set(isAllowNull());
   final ModelNode defaultValue = valueType.getDefaultValue();
   if (!forOperation && defaultValue != null && defaultValue.isDefined()) {
     result.get(ModelDescriptionConstants.DEFAULT).set(defaultValue);
   }
   MeasurementUnit measurementUnit = valueType.getMeasurementUnit();
   if (measurementUnit != null && measurementUnit != MeasurementUnit.NONE) {
     result.get(ModelDescriptionConstants.UNIT).set(measurementUnit.getName());
   }
   final String[] alternatives = valueType.getAlternatives();
   if (alternatives != null) {
     for (final String alternative : alternatives) {
       result.get(ModelDescriptionConstants.ALTERNATIVES).add(alternative);
     }
   }
   final String[] requires = valueType.getRequires();
   if (requires != null) {
     for (final String required : requires) {
       result.get(ModelDescriptionConstants.REQUIRES).add(required);
     }
   }
   final ParameterValidator validator = valueType.getValidator();
   if (validator instanceof MinMaxValidator) {
     MinMaxValidator minMax = (MinMaxValidator) validator;
     Long min = minMax.getMin();
     if (min != null) {
       switch (valueType.getType()) {
         case STRING:
         case LIST:
         case OBJECT:
           result.get(ModelDescriptionConstants.MIN_LENGTH).set(min);
           break;
         default:
           result.get(ModelDescriptionConstants.MIN).set(min);
       }
     }
     Long max = minMax.getMax();
     if (max != null) {
       switch (valueType.getType()) {
         case STRING:
         case LIST:
         case OBJECT:
           result.get(ModelDescriptionConstants.MAX_LENGTH).set(max);
           break;
         default:
           result.get(ModelDescriptionConstants.MAX).set(max);
       }
     }
   }
   if (validator instanceof AllowedValuesValidator) {
     AllowedValuesValidator avv = (AllowedValuesValidator) validator;
     List<ModelNode> allowed = avv.getAllowedValues();
     if (allowed != null) {
       for (ModelNode ok : allowed) {
         result.get(ModelDescriptionConstants.ALLOWED).add(ok);
       }
     }
   }
   return result;
 }
 protected void addValueTypeDescription(
     final ModelNode node,
     final String prefix,
     final ResourceBundle bundle,
     boolean forOperation,
     final ResourceDescriptionResolver resolver,
     Locale locale) {
   node.get(ModelDescriptionConstants.DESCRIPTION); // placeholder
   node.get(ModelDescriptionConstants.EXPRESSIONS_ALLOWED).set(valueType.isAllowExpression());
   if (forOperation) {
     node.get(ModelDescriptionConstants.REQUIRED).set(!valueType.isAllowNull());
   }
   node.get(ModelDescriptionConstants.NILLABLE).set(isAllowNull());
   final ModelNode defaultValue = valueType.getDefaultValue();
   if (!forOperation && defaultValue != null && defaultValue.isDefined()) {
     node.get(ModelDescriptionConstants.DEFAULT).set(defaultValue);
   }
   MeasurementUnit measurementUnit = valueType.getMeasurementUnit();
   if (measurementUnit != null && measurementUnit != MeasurementUnit.NONE) {
     node.get(ModelDescriptionConstants.UNIT).set(measurementUnit.getName());
   }
   final String[] alternatives = valueType.getAlternatives();
   if (alternatives != null) {
     for (final String alternative : alternatives) {
       node.get(ModelDescriptionConstants.ALTERNATIVES).add(alternative);
     }
   }
   final String[] requires = valueType.getRequires();
   if (requires != null) {
     for (final String required : requires) {
       node.get(ModelDescriptionConstants.REQUIRES).add(required);
     }
   }
   final ParameterValidator validator = valueType.getValidator();
   if (validator instanceof MinMaxValidator) {
     MinMaxValidator minMax = (MinMaxValidator) validator;
     Long min = minMax.getMin();
     if (min != null) {
       switch (valueType.getType()) {
         case STRING:
         case LIST:
         case OBJECT:
         case BYTES:
           node.get(ModelDescriptionConstants.MIN_LENGTH).set(min);
           break;
         default:
           node.get(ModelDescriptionConstants.MIN).set(min);
       }
     }
     Long max = minMax.getMax();
     if (max != null) {
       switch (valueType.getType()) {
         case STRING:
         case LIST:
         case OBJECT:
         case BYTES:
           node.get(ModelDescriptionConstants.MAX_LENGTH).set(max);
           break;
         default:
           node.get(ModelDescriptionConstants.MAX).set(max);
       }
     }
   }
   addAllowedValuesToDescription(node, validator);
   valueType.addValueTypeDescription(node, prefix, bundle, resolver, locale);
 }