/* * Copyright (C) 2015 Red Hat, inc., 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 library 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 library 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 library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ package org.jboss.as.controller.test; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.INCLUDE_ALIASES; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.INCLUDE_RUNTIME; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAME; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_ATTRIBUTE_GROUP_NAMES_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_ATTRIBUTE_GROUP_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESOLVE_EXPRESSIONS; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Set; import org.jboss.as.controller.ManagementModel; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.OperationStepHandler; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; 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.ManagementResourceRegistration; import org.jboss.as.controller.registry.Resource; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; import org.jboss.dmr.Property; import org.jboss.dmr.ValueExpression; import org.junit.BeforeClass; import org.junit.Test; /** * * @author <a href="mailto:ehugonne@redhat.com">Emmanuel Hugonnet</a> (c) 2015 Red Hat, inc. */ public class ReadAttributeGroupTestCase extends AbstractControllerTestBase { @BeforeClass public static void setSystemPropertyForResolution() { System.setProperty("my.value", "resolved"); } @Test public void testAttributeGroupNames() throws Exception { ModelNode operation = createOperation(READ_ATTRIBUTE_GROUP_NAMES_OPERATION, "subsystem", "basicSubsystem"); ModelNode result = executeForResult(operation); assertNotNull(result); List<ModelNode> groupNames = result.asList(); assertThat(groupNames, is(notNullValue())); assertThat(groupNames.size(), is(2)); Set<String> groups = new HashSet<>(2); for(ModelNode groupName : groupNames) { groups.add(groupName.asString()); } assertThat(groups, hasItems("group1", "group2")); } @Test public void testSimpleAttributeGroup() throws Exception { ModelNode operation = createOperation(READ_ATTRIBUTE_GROUP_OPERATION, "subsystem", "basicSubsystem"); operation.get(NAME).set("group1"); ModelNode result = executeForResult(operation); assertNotNull(result); List<Property> attributesPerGroup = result.asPropertyList(); assertThat(attributesPerGroup, is(notNullValue())); assertThat(attributesPerGroup.size(), is(3)); LinkedHashMap<String, String> attributes = mapAttributes(attributesPerGroup); assertThat(attributes.keySet(), hasItems("eigth", "first", "second")); assertThat(attributes.values(), hasItems("configuration1", "${my.value}", "undefined")); } @Test public void testRuntimeAttributeGroup() throws Exception { ModelNode operation = createOperation(READ_ATTRIBUTE_GROUP_OPERATION, "subsystem", "basicSubsystem"); operation.get(NAME).set("group1"); operation.get(INCLUDE_RUNTIME).set(true); ModelNode result = executeForResult(operation); assertNotNull(result); List<Property> attributesPerGroup = result.asPropertyList(); assertThat(attributesPerGroup, is(notNullValue())); assertThat(attributesPerGroup.size(), is(4)); LinkedHashMap<String, String> attributes = mapAttributes(attributesPerGroup); assertThat(attributes.keySet(), hasItems("eigth", "fifth", "first", "second")); assertThat(attributes.values(), hasItems("configuration1", "runtime5", "${my.value}", "undefined")); } @Test public void testResolveAttributeGroup() throws Exception { ModelNode operation = createOperation(READ_ATTRIBUTE_GROUP_OPERATION, "subsystem", "basicSubsystem"); operation.get(NAME).set("group1"); operation.get(RESOLVE_EXPRESSIONS).set(true); ModelNode result = executeForResult(operation); assertNotNull(result); List<Property> attributesPerGroup = result.asPropertyList(); assertThat(attributesPerGroup, is(notNullValue())); assertThat(attributesPerGroup.size(), is(3)); LinkedHashMap<String, String> attributes = mapAttributes(attributesPerGroup); assertThat(attributes.keySet(), hasItems("eigth", "first", "second")); assertThat(attributes.values(), hasItems("configuration1", "resolved", "undefined")); } @Test public void testAliasAttributeGroup() throws Exception { ModelNode operation = createOperation(READ_ATTRIBUTE_GROUP_OPERATION, "subsystem", "basicSubsystem"); operation.get(NAME).set("group2"); operation.get(INCLUDE_ALIASES).set(true); ModelNode result = executeForResult(operation); assertNotNull(result); List<Property> attributesPerGroup = result.asPropertyList(); assertThat(attributesPerGroup, is(notNullValue())); assertThat(attributesPerGroup.size(), is(3)); LinkedHashMap<String, String> attributes = mapAttributes(attributesPerGroup); assertThat(attributes.keySet(), hasItems("seventh", "sixth", "third")); assertThat(attributes.values(), hasItems("configuration6", "configuration6", "configuration3")); } private LinkedHashMap<String, String> mapAttributes(List<Property> attributes) { LinkedHashMap<String, String> result = new LinkedHashMap<String, String>(attributes.size()); for (Property attribute : attributes) { result.put(attribute.getName(), attribute.getValue().asString()); } return result; } @Override protected void initModel(ManagementModel managementModel) { ManagementResourceRegistration registration = managementModel.getRootResourceRegistration(); GlobalOperationHandlers.registerGlobalOperations(registration, processType); GlobalNotifications.registerGlobalNotifications(registration, processType); ManagementResourceRegistration basicResourceRegistration = registration.registerSubModel( new SimpleResourceDefinition(PathElement.pathElement("subsystem", "basicSubsystem"), new NonResolvingResourceDescriptionResolver())); basicResourceRegistration.registerReadOnlyAttribute(TestUtils.createAttribute("first", ModelType.STRING, "group1", false), null); basicResourceRegistration.registerReadOnlyAttribute(TestUtils.createAttribute("second", ModelType.STRING, "group1", false), null); basicResourceRegistration.registerReadOnlyAttribute(TestUtils.createAttribute("third", ModelType.STRING, "group2", false), null); basicResourceRegistration.registerReadOnlyAttribute(TestUtils.createAttribute("fourth", ModelType.STRING, "group2", true), null); basicResourceRegistration.registerReadOnlyAttribute(TestUtils.createAttribute("fifth", ModelType.STRING, "group1", true), null); basicResourceRegistration.registerReadOnlyAttribute(TestUtils.createAttribute("sixth", ModelType.STRING, "group2", false, false), null); basicResourceRegistration.registerReadOnlyAttribute(TestUtils.createAttribute("seventh", ModelType.STRING, "group2", false, true), ShowModelAliasReadHandler.INSTANCE); basicResourceRegistration.registerReadOnlyAttribute(TestUtils.createAttribute("eigth", ModelType.STRING, "group1", false, false, true), null); registration.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("subsystem", "basicSubsystem", "first").set("configuration1"); model.get("subsystem", "basicSubsystem", "second").set(new ValueExpression("${my.value}")); model.get("subsystem", "basicSubsystem", "third").set("configuration3"); model.get("subsystem", "basicSubsystem", "fourth").set("runtime4"); model.get("subsystem", "basicSubsystem", "fifth").set("runtime5"); model.get("subsystem", "basicSubsystem", "sixth").set("configuration6"); model.get("subsystem", "basicSubsystem", "seventh").set("alias7"); createModel(context, model); } } ); } private static class ShowModelAliasReadHandler implements OperationStepHandler { static final ShowModelAliasReadHandler INSTANCE = new ShowModelAliasReadHandler(); @Override public void execute(OperationContext context, ModelNode operation) throws OperationFailedException { final Resource resource = context.readResource(PathAddress.EMPTY_ADDRESS); if (resource.getModel().hasDefined("sixth")) { context.getResult().set(resource.getModel().get("sixth").asString()); } } } }