/* * JBoss, Home of Professional Open Source. * Copyright 2011, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.controller.test; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ACCESS_TYPE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ATTRIBUTES; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ATTRIBUTE_VALUE_WRITTEN_NOTIFICATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CHILDREN; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIPTION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILED; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILURE_DESCRIPTION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.MIN_LENGTH; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.MODEL_DESCRIPTION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAME; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NILLABLE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NOTIFICATIONS; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NOTIFICATION_TYPE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OPERATIONS; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OPERATION_NAME; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.PROFILE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_ATTRIBUTE_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_CHILDREN_NAMES_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_CHILDREN_RESOURCES_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_CHILDREN_TYPES_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_OPERATION_DESCRIPTION_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_OPERATION_NAMES_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_RESOURCE_DESCRIPTION_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_RESOURCE_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESOURCE_ADDED_NOTIFICATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESOURCE_REMOVED_NOTIFICATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESULT; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.TYPE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE_TYPE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Set; import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.ManagementModel; import org.jboss.as.controller.ModelOnlyWriteAttributeHandler; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.OperationStepHandler; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.ProcessType; import org.jboss.as.controller.ResourceBuilder; import org.jboss.as.controller.ResourceDefinition; import org.jboss.as.controller.SimpleAttributeDefinitionBuilder; import org.jboss.as.controller.SimpleResourceDefinition; import org.jboss.as.controller.descriptions.NonResolvingResourceDescriptionResolver; import org.jboss.as.controller.operations.global.GlobalNotifications; import org.jboss.as.controller.operations.global.GlobalOperationHandlers; import org.jboss.as.controller.registry.AttributeAccess.AccessType; import org.jboss.as.controller.registry.ManagementResourceRegistration; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; import org.jboss.dmr.Property; import org.jboss.dmr.ValueExpression; /** * @author <a href="kabir.khan@jboss.com">Kabir Khan</a> */ public abstract class AbstractGlobalOperationsTestCase extends AbstractControllerTestBase { private final AccessType expectedRwAttributeAccess; protected AbstractGlobalOperationsTestCase() { super(); this.expectedRwAttributeAccess = AccessType.READ_WRITE; } protected AbstractGlobalOperationsTestCase(ProcessType processType, AccessType expectedRwAttributeAccess) { super(processType); this.expectedRwAttributeAccess = expectedRwAttributeAccess; } @Override protected void initModel(ManagementModel managementModel) { ManagementResourceRegistration rootRegistration = managementModel.getRootResourceRegistration(); GlobalOperationHandlers.registerGlobalOperations(rootRegistration, processType); GlobalNotifications.registerGlobalNotifications(rootRegistration, processType); rootRegistration.registerOperationHandler(TestUtils.SETUP_OPERATION_DEF, new OperationStepHandler() { @Override public void execute(OperationContext context, ModelNode operation) throws OperationFailedException { final ModelNode model = new ModelNode(); //Atttributes model.get("profile", "profileA", "name").set("profileA"); model.get("profile", "profileA", "subsystem", "subsystem1", "attr1").add(1); model.get("profile", "profileA", "subsystem", "subsystem1", "attr1").add(2); //Children model.get("profile", "profileA", "subsystem", "subsystem1", "type1", "thing1", "name").set("Name11"); model.get("profile", "profileA", "subsystem", "subsystem1", "type1", "thing1", "value").set("201"); model.get("profile", "profileA", "subsystem", "subsystem1", "type1", "thing2", "name").set("Name12"); model.get("profile", "profileA", "subsystem", "subsystem1", "type1", "thing2", "value").set("202"); model.get("profile", "profileA", "subsystem", "subsystem1", "type2", "other", "name").set("Name2"); model.get("profile", "profileA", "subsystem", "subsystem2", "bigdecimal").set(new BigDecimal(100)); model.get("profile", "profileA", "subsystem", "subsystem2", "biginteger").set(new BigInteger("101")); model.get("profile", "profileA", "subsystem", "subsystem2", "boolean").set(true); model.get("profile", "profileA", "subsystem", "subsystem2", "bytes").set(new byte[]{1, 2, 3}); model.get("profile", "profileA", "subsystem", "subsystem2", "double").set(Double.MAX_VALUE); model.get("profile", "profileA", "subsystem", "subsystem2", "expression").set(new ValueExpression("{expr}")); model.get("profile", "profileA", "subsystem", "subsystem2", "int").set(102); model.get("profile", "profileA", "subsystem", "subsystem2", "list").add("l1A"); model.get("profile", "profileA", "subsystem", "subsystem2", "list").add("l1B"); model.get("profile", "profileA", "subsystem", "subsystem2", "long").set(Long.MAX_VALUE); model.get("profile", "profileA", "subsystem", "subsystem2", "object", "value").set("objVal"); model.get("profile", "profileA", "subsystem", "subsystem2", "property").set(new Property("prop1", new ModelNode().set("value1"))); model.get("profile", "profileA", "subsystem", "subsystem2", "string1").set("s1"); model.get("profile", "profileA", "subsystem", "subsystem2", "string2").set("s2"); model.get("profile", "profileA", "subsystem", "subsystem2", "type").set(ModelType.TYPE); model.get("profile", "profileB", "name").set("Profile B"); model.get("profile", "profileC", "name").set("profileC"); model.get("profile", "profileC", "subsystem", "subsystem4"); model.get("profile", "profileC", "subsystem", "subsystem5", "name").set("Test"); createModel(context, model); } } ); ResourceDefinition profileDef = ResourceBuilder.Factory.create(PathElement.pathElement("profile", "*"), new NonResolvingResourceDescriptionResolver()) .addReadOnlyAttribute(SimpleAttributeDefinitionBuilder.create("name", ModelType.STRING, false).setMinSize(1).build()) .build(); ManagementResourceRegistration profileReg = rootRegistration.registerSubModel(profileDef); ManagementResourceRegistration profileSub1Reg = profileReg.registerSubModel(new Subsystem1RootResource()); ManagementResourceRegistration profileASub2Reg = profileReg.registerSubModel( new SimpleResourceDefinition(PathElement.pathElement("subsystem", "subsystem2"), new NonResolvingResourceDescriptionResolver())); AttributeDefinition longAttr = TestUtils.createAttribute("long", ModelType.LONG, "number"); profileASub2Reg.registerReadWriteAttribute(longAttr, null, new ModelOnlyWriteAttributeHandler(longAttr)); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("type", ModelType.TYPE), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("string1", ModelType.STRING), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("string2", ModelType.STRING), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("property", ModelType.STRING), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("object", ModelType.OBJECT), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("list", ModelType.LIST), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("int", ModelType.INT), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("expression", ModelType.STRING), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("double", ModelType.DOUBLE), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("bytes", ModelType.BYTES), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("bigdecimal", ModelType.BIG_DECIMAL), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("biginteger", ModelType.BIG_INTEGER), null); profileASub2Reg.registerReadOnlyAttribute(TestUtils.createAttribute("boolean", ModelType.BOOLEAN), null); ManagementResourceRegistration profileBSub3Reg = profileReg.registerSubModel( new SimpleResourceDefinition(PathElement.pathElement("subsystem", "subsystem3"), new NonResolvingResourceDescriptionResolver())); profileSub1Reg.registerOperationHandler(TestUtils.createOperationDefinition("testA1-1", TestUtils.createAttribute("paramA1", ModelType.INT)), new OperationStepHandler() { @Override public void execute(OperationContext context, ModelNode operation) { } } ); profileSub1Reg.registerOperationHandler(TestUtils.createOperationDefinition("testA1-2", TestUtils.createAttribute("paramA2", ModelType.STRING)), new OperationStepHandler() { @Override public void execute(OperationContext context, ModelNode operation) { } } ); profileASub2Reg.registerOperationHandler(TestUtils.createOperationDefinition("testA2", TestUtils.createAttribute("paramB", ModelType.LONG)), new OperationStepHandler() { @Override public void execute(OperationContext context, ModelNode operation) { } } ); ManagementResourceRegistration profileCSub4Reg = profileReg.registerSubModel( new SimpleResourceDefinition(PathElement.pathElement("subsystem", "subsystem4"), new NonResolvingResourceDescriptionResolver())); ManagementResourceRegistration profileCSub5Reg = profileReg.registerSubModel( new SimpleResourceDefinition(PathElement.pathElement("subsystem", "subsystem5"), new NonResolvingResourceDescriptionResolver())); profileCSub5Reg.registerReadOnlyAttribute(TestUtils.createAttribute("name", ModelType.STRING, "varchar"), new OperationStepHandler() { @Override public void execute(OperationContext context, ModelNode operation) { context.getResult().set("Overridden by special read handler"); } }); ResourceDefinition profileCSub5Type1RegDef = ResourceBuilder.Factory.create(PathElement.pathElement("type1", "thing1"), new NonResolvingResourceDescriptionResolver()) .build(); ManagementResourceRegistration profileCSub5Type1Reg = profileCSub5Reg.registerSubModel(profileCSub5Type1RegDef); ManagementResourceRegistration profileCSub6Reg = profileReg.registerSubModel( new SimpleResourceDefinition(PathElement.pathElement("subsystem", "subsystem6"), new NonResolvingResourceDescriptionResolver())); profileCSub6Reg.registerOperationHandler(TestUtils.createOperationDefinition("testA", true), new OperationStepHandler() { @Override public void execute(OperationContext context, ModelNode operation) { } } ); } /** * Override to get the actual result from the response. * @param operation * @return * @throws OperationFailedException */ @Override public ModelNode executeForResult(ModelNode operation) throws OperationFailedException { ModelNode rsp = getController().execute(operation, null, null, null); if (FAILED.equals(rsp.get(OUTCOME).asString())) { ModelNode fd = rsp.get(FAILURE_DESCRIPTION); throw new OperationFailedException(fd.toString(), fd); } return rsp.get(RESULT); } static class TestMetricHandler implements OperationStepHandler { static final TestMetricHandler INSTANCE = new TestMetricHandler(); private static final Random random = new Random(); @Override public void execute(final OperationContext context, final ModelNode operation) { context.getResult().set(random.nextInt()); } } protected void checkRootNodeDescription(ModelNode result, boolean recursive, boolean operations, boolean notifications) { assertEquals("description", result.require(DESCRIPTION).asString()); assertEquals("profile", result.require(CHILDREN).require(PROFILE).require(DESCRIPTION).asString()); if (operations) { assertTrue(result.require(OPERATIONS).isDefined()); Set<String> ops = result.require(OPERATIONS).keys(); assertTrue(ops.contains(READ_ATTRIBUTE_OPERATION)); assertTrue(ops.contains(READ_CHILDREN_NAMES_OPERATION)); assertTrue(ops.contains(READ_CHILDREN_TYPES_OPERATION)); assertTrue(ops.contains(READ_OPERATION_DESCRIPTION_OPERATION)); assertTrue(ops.contains(READ_OPERATION_NAMES_OPERATION)); assertTrue(ops.contains(READ_RESOURCE_DESCRIPTION_OPERATION)); assertTrue(ops.contains(READ_RESOURCE_OPERATION)); assertEquals(processType != ProcessType.DOMAIN_SERVER, ops.contains(WRITE_ATTRIBUTE_OPERATION)); for (String op : ops) { assertEquals(op, result.require(OPERATIONS).require(op).require(OPERATION_NAME).asString()); } } else { assertFalse(result.get(OPERATIONS).isDefined()); } if (!recursive) { assertFalse(result.require(CHILDREN).require(PROFILE).require(MODEL_DESCRIPTION).isDefined()); return; } assertTrue(result.require(CHILDREN).require(PROFILE).require(MODEL_DESCRIPTION).isDefined()); assertEquals(1, result.require(CHILDREN).require(PROFILE).require(MODEL_DESCRIPTION).keys().size()); checkProfileNodeDescription(result.require(CHILDREN).require(PROFILE).require(MODEL_DESCRIPTION).require("*"), true, operations, notifications); } protected void checkProfileNodeDescription(ModelNode result, boolean recursive, boolean operations, boolean notifications) { assertEquals(ModelType.STRING, result.require(ATTRIBUTES).require(NAME).require(TYPE).asType()); assertEquals(false, result.require(ATTRIBUTES).require(NAME).require(NILLABLE).asBoolean()); assertEquals(1, result.require(ATTRIBUTES).require(NAME).require(MIN_LENGTH).asInt()); assertEquals("subsystem", result.require(CHILDREN).require(SUBSYSTEM).require(DESCRIPTION).asString()); if (!recursive) { assertFalse(result.require(CHILDREN).require(SUBSYSTEM).require(MODEL_DESCRIPTION).isDefined()); return; } assertTrue(result.require(CHILDREN).require(SUBSYSTEM).require(MODEL_DESCRIPTION).isDefined()); assertEquals(getExpectedNumberProfiles(), result.require(CHILDREN).require(SUBSYSTEM).require(MODEL_DESCRIPTION).keys().size()); checkSubsystem1Description(result.require(CHILDREN).require(SUBSYSTEM).require(MODEL_DESCRIPTION).require("subsystem1"), recursive, operations, notifications); } protected int getExpectedNumberProfiles() { //Some tests might add more, if so they should override this method return 6; } protected void checkSubsystem1Description(ModelNode result, boolean recursive, boolean operations, boolean notifications) { assertNotNull(result); assertEquals(ModelType.LIST, result.require(ATTRIBUTES).require("attr1").require(TYPE).asType()); assertEquals(ModelType.INT, result.require(ATTRIBUTES).require("attr1").require(VALUE_TYPE).asType()); assertFalse(result.require(ATTRIBUTES).require("attr1").require(NILLABLE).asBoolean()); assertEquals(AccessType.READ_ONLY.toString(), result.require(ATTRIBUTES).require("attr1").get(ACCESS_TYPE).asString()); assertEquals(ModelType.INT, result.require(ATTRIBUTES).require("read-only").require(TYPE).asType()); assertTrue(result.require(ATTRIBUTES).require("read-only").require(NILLABLE).asBoolean()); assertEquals(AccessType.READ_ONLY.toString(), result.require(ATTRIBUTES).require("read-only").get(ACCESS_TYPE).asString()); assertEquals(ModelType.INT, result.require(ATTRIBUTES).require("metric1").require(TYPE).asType()); assertEquals(AccessType.METRIC.toString(), result.require(ATTRIBUTES).require("metric1").get(ACCESS_TYPE).asString()); assertEquals(AccessType.METRIC.toString(), result.require(ATTRIBUTES).require("metric2").get(ACCESS_TYPE).asString()); assertEquals(ModelType.INT, result.require(ATTRIBUTES).require("read-write").require(TYPE).asType()); assertTrue(result.require(ATTRIBUTES).require("read-write").require(NILLABLE).asBoolean()); assertEquals(expectedRwAttributeAccess.toString(), result.require(ATTRIBUTES).require("read-write").get(ACCESS_TYPE).asString()); //we don't have proper support for this! /*assertEquals(1, result.require(CHILDREN).require("type1").require(MIN_OCCURS).asInt()); assertEquals(1, result.require(CHILDREN).require("type2").require(MIN_OCCURS).asInt()); assertEquals(1, result.require(CHILDREN).require("type2").require(MIN_OCCURS).asInt());*/ assertEquals("type1", result.require(CHILDREN).require("type1").require(DESCRIPTION).asString()); assertEquals("type2", result.require(CHILDREN).require("type2").require(DESCRIPTION).asString()); if (operations) { assertTrue(result.require(OPERATIONS).isDefined()); Set<String> ops = result.require(OPERATIONS).keys(); assertEquals(processType == ProcessType.DOMAIN_SERVER ? 18 : 23, ops.size()); boolean runtimeOnly = processType != ProcessType.DOMAIN_SERVER; assertEquals(runtimeOnly, ops.contains("testA1-1")); assertEquals(runtimeOnly, ops.contains("testA1-2")); assertTrue(ops.contains(READ_RESOURCE_OPERATION)); assertTrue(ops.contains(READ_ATTRIBUTE_OPERATION)); assertTrue(ops.contains(READ_RESOURCE_DESCRIPTION_OPERATION)); assertTrue(ops.contains(READ_CHILDREN_NAMES_OPERATION)); assertTrue(ops.contains(READ_CHILDREN_TYPES_OPERATION)); assertTrue(ops.contains(READ_CHILDREN_RESOURCES_OPERATION)); assertTrue(ops.contains(READ_OPERATION_NAMES_OPERATION)); assertTrue(ops.contains(READ_OPERATION_DESCRIPTION_OPERATION)); assertEquals(runtimeOnly, ops.contains(WRITE_ATTRIBUTE_OPERATION)); } else { assertFalse(result.get(OPERATIONS).isDefined()); } if (notifications) { assertTrue(result.require(NOTIFICATIONS).isDefined()); Set<String> notifs = result.require(NOTIFICATIONS).keys(); assertEquals(processType == ProcessType.DOMAIN_SERVER ? 2 : 3, notifs.size()); boolean runtimeOnly = processType != ProcessType.DOMAIN_SERVER; assertTrue(notifs.contains(RESOURCE_ADDED_NOTIFICATION)); assertTrue(notifs.contains(RESOURCE_REMOVED_NOTIFICATION)); assertEquals(runtimeOnly, notifs.contains(ATTRIBUTE_VALUE_WRITTEN_NOTIFICATION)); } else { assertFalse(result.get(NOTIFICATIONS).isDefined()); } if (!recursive) { assertFalse(result.require(CHILDREN).require("type1").require(MODEL_DESCRIPTION).isDefined()); assertFalse(result.require(CHILDREN).require("type2").require(MODEL_DESCRIPTION).isDefined()); return; } checkType1Description(result.require(CHILDREN).require("type1").require(MODEL_DESCRIPTION).require("*")); checkType2Description(result.require(CHILDREN).require("type2").require(MODEL_DESCRIPTION).require("other")); } protected void checkType1Description(ModelNode result) { assertNotNull(result); assertEquals(ModelType.STRING, result.require(ATTRIBUTES).require("name").require(TYPE).asType()); assertEquals("name", result.require(ATTRIBUTES).require("name").require(DESCRIPTION).asString()); assertFalse(result.require(ATTRIBUTES).require("name").require(NILLABLE).asBoolean()); assertEquals(ModelType.INT, result.require(ATTRIBUTES).require("value").require(TYPE).asType()); assertEquals("value", result.require(ATTRIBUTES).require("value").require(DESCRIPTION).asString()); assertFalse(result.require(ATTRIBUTES).require("value").require(NILLABLE).asBoolean()); //TODO should the inherited ops be picked up? if (result.hasDefined(OPERATIONS)) { assertTrue(result.require(OPERATIONS).isDefined()); Set<String> ops = result.require(OPERATIONS).keys(); assertEquals(processType == ProcessType.DOMAIN_SERVER ? 18 : 21, ops.size()); assertTrue(ops.contains(READ_RESOURCE_OPERATION)); assertTrue(ops.contains(READ_ATTRIBUTE_OPERATION)); assertTrue(ops.contains(READ_RESOURCE_DESCRIPTION_OPERATION)); assertTrue(ops.contains(READ_CHILDREN_NAMES_OPERATION)); assertTrue(ops.contains(READ_CHILDREN_TYPES_OPERATION)); assertTrue(ops.contains(READ_CHILDREN_RESOURCES_OPERATION)); assertTrue(ops.contains(READ_OPERATION_NAMES_OPERATION)); assertTrue(ops.contains(READ_OPERATION_DESCRIPTION_OPERATION)); assertEquals(processType != ProcessType.DOMAIN_SERVER, ops.contains(WRITE_ATTRIBUTE_OPERATION)); } if (result.hasDefined(NOTIFICATIONS)) { assertTrue(result.require(NOTIFICATIONS).isDefined()); Set<String> notifs = result.require(NOTIFICATIONS).keys(); assertEquals(processType == ProcessType.DOMAIN_SERVER ? 2 : 3, notifs.size()); assertTrue(notifs.contains(RESOURCE_ADDED_NOTIFICATION)); assertTrue(notifs.contains(RESOURCE_REMOVED_NOTIFICATION)); assertEquals(processType != ProcessType.DOMAIN_SERVER, notifs.contains(ATTRIBUTE_VALUE_WRITTEN_NOTIFICATION)); for (String notif : notifs) { assertEquals(notif, result.require(NOTIFICATIONS).require(notif).require(NOTIFICATION_TYPE).asString()); } } } protected void checkType2Description(ModelNode result) { assertNotNull(result); assertEquals("description", result.require(DESCRIPTION).asString()); assertEquals(ModelType.STRING, result.require(ATTRIBUTES).require("name").require(TYPE).asType()); assertEquals("name", result.require(ATTRIBUTES).require("name").require(DESCRIPTION).asString()); assertFalse(result.require(ATTRIBUTES).require("name").require(NILLABLE).asBoolean()); if (result.hasDefined(OPERATIONS)) { assertTrue(result.require(OPERATIONS).isDefined()); Set<String> ops = result.require(OPERATIONS).keys(); assertEquals(processType == ProcessType.DOMAIN_SERVER ? 18 : 21, ops.size()); assertTrue(ops.contains(READ_RESOURCE_OPERATION)); assertTrue(ops.contains(READ_ATTRIBUTE_OPERATION)); assertTrue(ops.contains(READ_RESOURCE_DESCRIPTION_OPERATION)); assertTrue(ops.contains(READ_CHILDREN_NAMES_OPERATION)); assertTrue(ops.contains(READ_CHILDREN_TYPES_OPERATION)); assertTrue(ops.contains(READ_CHILDREN_RESOURCES_OPERATION)); assertTrue(ops.contains(READ_OPERATION_NAMES_OPERATION)); assertTrue(ops.contains(READ_OPERATION_DESCRIPTION_OPERATION)); assertEquals(processType != ProcessType.DOMAIN_SERVER, ops.contains(WRITE_ATTRIBUTE_OPERATION)); } if (result.hasDefined(NOTIFICATIONS)) { assertTrue(result.require(NOTIFICATIONS).isDefined()); Set<String> notifs = result.require(NOTIFICATIONS).keys(); assertEquals(processType == ProcessType.DOMAIN_SERVER ? 2 : 3, notifs.size()); assertTrue(notifs.contains(RESOURCE_ADDED_NOTIFICATION)); assertTrue(notifs.contains(RESOURCE_REMOVED_NOTIFICATION)); assertEquals(processType != ProcessType.DOMAIN_SERVER, notifs.contains(ATTRIBUTE_VALUE_WRITTEN_NOTIFICATION)); } } protected ModelNode createOperation(String operationName, String... address) { ModelNode operation = new ModelNode(); operation.get(OP).set(operationName); if (address.length > 0) { for (String addr : address) { operation.get(OP_ADDR).add(addr); } } else { operation.get(OP_ADDR).setEmptyList(); } return operation; } protected List<String> modelNodeListToStringList(List<ModelNode> nodes) { List<String> result = new ArrayList<String>(); for (ModelNode node : nodes) { result.add(node.asString()); } return result; } }