code: public void validateOperation(final ModelNode operation) {
          if (operation == null) {
              return;
          }
          final PathAddress address = PathAddress.pathAddress(operation.get(OP_ADDR));
          final String name = operation.get(OP).asString();
  
          OperationEntry entry = root.getOperationEntry(address, name);
          if (entry == null) {
              throwOrWarnAboutDescriptorProblem(ControllerLogger.ROOT_LOGGER.noOperationEntry(name, address));
          }
          //noinspection ConstantConditions
          if (entry.getType() == EntryType.PRIVATE || entry.getFlags().contains(OperationEntry.Flag.HIDDEN)) {
              return;
          }
          if (entry.getOperationHandler() == null) {
              throwOrWarnAboutDescriptorProblem(ControllerLogger.ROOT_LOGGER.noOperationHandler(name, address));
          }
          final DescriptionProvider provider = getDescriptionProvider(operation);
          final ModelNode description = provider.getModelDescription(null);
  
          final Map<String, ModelNode> describedProperties = getDescribedRequestProperties(operation, description);
          final Map<String, ModelNode> actualParams = getActualRequestProperties(operation);
  
          checkActualOperationParamsAreDescribed(operation, describedProperties, actualParams);
          checkAllRequiredPropertiesArePresent(description, operation, describedProperties, actualParams);
          checkParameterTypes(description, operation, describedProperties, actualParams);
  
          //TODO check ranges
      }
docs: Validates an operation against its description provider
  
  @param operation The operation to validate
  @throws IllegalArgumentException if the operation is not valid