@Override
 public ManagementResourceRegistration registerSubModel(
     final ResourceDefinition resourceDefinition) {
   if (resourceDefinition == null) {
     throw ControllerLogger.ROOT_LOGGER.nullVar("resourceDefinition");
   }
   final PathElement address = resourceDefinition.getPathElement();
   if (address == null) {
     throw ControllerLogger.ROOT_LOGGER.cannotRegisterSubmodelWithNullPath();
   }
   if (isRuntimeOnly()) {
     throw ControllerLogger.ROOT_LOGGER.cannotRegisterSubmodel();
   }
   final AbstractResourceRegistration existing =
       getSubRegistration(PathAddress.pathAddress(address));
   if (existing != null && existing.getValueString().equals(address.getValue())) {
     throw ControllerLogger.ROOT_LOGGER.nodeAlreadyRegistered(existing.getLocationString());
   }
   final String key = address.getKey();
   final NodeSubregistry child = getOrCreateSubregistry(key);
   final ManagementResourceRegistration resourceRegistration =
       child.register(address.getValue(), resourceDefinition, false);
   resourceDefinition.registerAttributes(resourceRegistration);
   resourceDefinition.registerOperations(resourceRegistration);
   resourceDefinition.registerChildren(resourceRegistration);
   if (constraintUtilizationRegistry != null
       && resourceDefinition instanceof ConstrainedResourceDefinition) {
     PathAddress childAddress = getPathAddress().append(address);
     List<AccessConstraintDefinition> constraintDefinitions =
         ((ConstrainedResourceDefinition) resourceDefinition).getAccessConstraints();
     for (AccessConstraintDefinition acd : constraintDefinitions) {
       constraintUtilizationRegistry.registerAccessConstraintResourceUtilization(
           acd.getKey(), childAddress);
     }
   }
   return resourceRegistration;
 }