public void addResource(PathAddress relativeAddress, Resource toAdd) {
   final PathAddress absoluteAddress = activeStep.address.append(relativeAddress);
   assert isControllingThread();
   Stage currentStage = this.currentStage;
   if (currentStage == null) {
     throw MESSAGES.operationAlreadyComplete();
   }
   if (currentStage != Stage.MODEL) {
     throw MESSAGES.stageAlreadyComplete(Stage.MODEL);
   }
   if (absoluteAddress.size() == 0) {
     throw MESSAGES.duplicateResourceAddress(absoluteAddress);
   }
   if (!isModelAffected()) {
     takeWriteLock();
     model = model.clone();
   }
   affectsModel.put(absoluteAddress, NULL);
   Resource model = this.model;
   final Iterator<PathElement> i = absoluteAddress.iterator();
   while (i.hasNext()) {
     final PathElement element = i.next();
     if (element.isMultiTarget()) {
       throw MESSAGES.cannotWriteTo("*");
     }
     if (!i.hasNext()) {
       final String key = element.getKey();
       if (model.hasChild(element)) {
         throw MESSAGES.duplicateResourceAddress(absoluteAddress);
       } else {
         final PathAddress parent = absoluteAddress.subAddress(0, absoluteAddress.size() - 1);
         final Set<String> childrenNames =
             modelController.getRootRegistration().getChildNames(parent);
         if (!childrenNames.contains(key)) {
           throw MESSAGES.noChildType(key);
         }
         model.registerChild(element, toAdd);
         model = toAdd;
       }
     } else {
       model = model.getChild(element);
       if (model == null) {
         PathAddress ancestor = PathAddress.EMPTY_ADDRESS;
         for (PathElement pe : absoluteAddress) {
           ancestor = ancestor.append(pe);
           if (element.equals(pe)) {
             break;
           }
         }
         throw MESSAGES.resourceNotFound(ancestor, absoluteAddress);
       }
     }
   }
 }
 private static Resource requireChild(
     final Resource resource, final PathElement childPath, final PathAddress fullAddress) {
   if (resource.hasChild(childPath)) {
     return resource.requireChild(childPath);
   } else {
     PathAddress missing = PathAddress.EMPTY_ADDRESS;
     for (PathElement search : fullAddress) {
       missing = missing.append(search);
       if (search.equals(childPath)) {
         break;
       }
     }
     throw ControllerMessages.MESSAGES.managementResourceNotFound(missing);
   }
 }