final ModelNode result = new ModelNode();
final ModelNode profile = context.readModel(PathAddress.EMPTY_ADDRESS);
result.setEmptyList();
final ImmutableManagementResourceRegistration registry = context.getResourceRegistration();
final AtomicReference<ModelNode> failureRef = new AtomicReference<ModelNode>();
final ModelNode subsystemResults = new ModelNode().setEmptyList();
final Map<String, ModelNode> includeResults = new HashMap<String, ModelNode>();
// Add a step at end to assemble all the data
// Add steps in the reverse of expected order, as Stage.IMMEDIATE adds to the top of the list
context.addStep(new OperationStepHandler() {
@Override
public void execute(OperationContext context, ModelNode operation) throws OperationFailedException {
boolean failed = false;
if (failureRef.get() != null) {
// One of our subsystems failed
context.getFailureDescription().set(failureRef.get());
failed = true;
} else {
for (ModelNode includeRsp : includeResults.values()) {
if (includeRsp.hasDefined(FAILURE_DESCRIPTION)) {
context.getFailureDescription().set(includeRsp.get(FAILURE_DESCRIPTION));
failed = true;
break;
}
ModelNode includeResult = includeRsp.get(RESULT);
if (includeResult.isDefined()) {
for (ModelNode op : includeResult.asList()) {
result.add(op);
}
}
}
}
if (!failed) {
for (ModelNode subsysRsp : subsystemResults.asList()) {
result.add(subsysRsp);
}
context.getResult().set(result);
}
context.completeStep();
}
}, OperationContext.Stage.IMMEDIATE);
if (profile.hasDefined(SUBSYSTEM)) {
for (final String subsystemName : profile.get(SUBSYSTEM).keys()) {
final ModelNode subsystemRsp = new ModelNode();
PathElement pe = PathElement.pathElement(SUBSYSTEM, subsystemName);
PathAddress fullAddress = address.append(pe);
final ModelNode subsystemAddress = fullAddress.toModelNode();
final ModelNode newOp = operation.clone();
newOp.get(OP_ADDR).set(subsystemAddress);
PathAddress relativeAddress = PathAddress.pathAddress(pe);
OperationStepHandler subsysHandler = registry.getOperationHandler(relativeAddress, opName);
if (subsysHandler == null) {
throw new OperationFailedException(new ModelNode().set(String.format("No handler for operation %s at address %s", opName, fullAddress)));
}
// Step to store subsystem ops in overall list