// TODO move this kind of logic into AttributeDefinition itself private static ModelNode validateResolvedModel( final AttributeDefinition definition, final OperationContext context, final ModelNode subModel) throws OperationFailedException { final String attributeName = definition.getName(); final boolean has = subModel.has(attributeName); if (!has && definition.isRequired(subModel)) { throw ServerMessages.MESSAGES.attributeIsRequired(attributeName); } ModelNode result; if (has) { if (!definition.isAllowed(subModel)) { if (subModel.hasDefined(attributeName)) { throw ServerMessages.MESSAGES.attributeNotAllowedWhenAlternativeIsPresent( attributeName, Arrays.asList(definition.getAlternatives())); } else { // create the undefined node result = new ModelNode(); } } else { result = definition.resolveModelAttribute(context, subModel); } } else { // create the undefined node result = new ModelNode(); } return result; }
@Override public void execute(final OperationContext context, final ModelNode ignored) throws OperationFailedException { final Resource resource = context.readResource(PathAddress.EMPTY_ADDRESS); final ModelNode model = resource.getModel(); for (final AttributeDefinition definition : InterfaceDescription.ROOT_ATTRIBUTES) { final String attributeName = definition.getName(); final boolean has = model.hasDefined(attributeName); if (!has && isRequired(definition, model)) { throw new OperationFailedException(new ModelNode().set(MESSAGES.required(attributeName))); } if (has) { if (!isAllowed(definition, model)) { // TODO probably move this into AttributeDefinition String[] alts = definition.getAlternatives(); StringBuilder sb = null; if (alts != null) { for (String alt : alts) { if (model.hasDefined(alt)) { if (sb == null) { sb = new StringBuilder(); } else { sb.append(", "); } sb.append(alt); } } } throw new OperationFailedException( new ModelNode().set(MESSAGES.invalidAttributeCombo(attributeName, sb))); } } } context.completeStep(); }
boolean isAllowed(final AttributeDefinition def, final ModelNode model) { final String[] alternatives = def.getAlternatives(); if (alternatives != null) { for (final String alternative : alternatives) { if (model.hasDefined(alternative)) { return false; } } } return true; }
boolean isRequired(final AttributeDefinition def, final ModelNode model) { final boolean required = !def.isAllowNull(); return required ? !hasAlternative(def.getAlternatives(), model) : required; }