public Resource removeResource(final PathAddress requestAddress) { final PathAddress address = activeStep.address.append(requestAddress); assert isControllingThread(); Stage currentStage = this.currentStage; if (currentStage == null) { throw MESSAGES.operationAlreadyComplete(); } if (currentStage != Stage.MODEL) { throw MESSAGES.stageAlreadyComplete(Stage.MODEL); } if (!isModelAffected()) { takeWriteLock(); model = model.clone(); } affectsModel.put(address, NULL); Resource model = this.model; final Iterator<PathElement> i = address.iterator(); while (i.hasNext()) { final PathElement element = i.next(); if (element.isMultiTarget()) { throw MESSAGES.cannotRemove("*"); } if (!i.hasNext()) { model = model.removeChild(element); } else { model = requireChild(model, element, address); } } return model; }
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); } } } }
public ModelNode readModelForUpdate(final PathAddress requestAddress) { final PathAddress address = activeStep.address.append(requestAddress); assert isControllingThread(); Stage currentStage = this.currentStage; if (currentStage == null) { throw MESSAGES.operationAlreadyComplete(); } if (currentStage != Stage.MODEL) { throw MESSAGES.stageAlreadyComplete(Stage.MODEL); } if (!isModelAffected()) { takeWriteLock(); model = model.clone(); } affectsModel.put(address, NULL); Resource model = this.model; final Iterator<PathElement> i = address.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)) { final PathAddress parent = address.subAddress(0, address.size() - 1); final Set<String> childrenNames = modelController.getRootRegistration().getChildNames(parent); if (!childrenNames.contains(key)) { throw MESSAGES.noChildType(key); } final Resource newModel = Resource.Factory.create(); model.registerChild(element, newModel); model = newModel; } else { model = requireChild(model, element, address); } } else { model = requireChild(model, element, address); } } if (model == null) { throw new IllegalStateException(); } return model.getModel(); }