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); } }