/*
* JBoss, Home of Professional Open Source.
* Copyright 2016, 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.operation.global;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.COMPOSITE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.STEPS;
import java.util.List;
import java.util.Map;
import org.jboss.as.controller.CompositeOperationHandler;
import org.jboss.as.controller.ExpressionResolver;
import org.jboss.as.controller.ManagementModel;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PropertiesAttributeDefinition;
import org.jboss.as.controller.ResourceDefinition;
import org.jboss.as.controller.StringListAttributeDefinition;
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.test.AbstractControllerTestBase;
import org.jboss.dmr.ModelNode;
import org.junit.Assert;
import org.junit.Test;
/**
* @author Tomaz Cerar (c) 2014 Red Hat Inc.
*/
public abstract class AbstractCollectionOperationsTestCase extends AbstractControllerTestBase {
protected static final String LIST_ATTRIBUTE_NAME = "my-list-attribute";
protected static final String MAP_ATTRIBUTE_NAME = "my-map-attribute";
protected static PathAddress TEST_ADDRESS = PathAddress.pathAddress("subsystem", "test");
protected ModelNode runtimeListAttributeValue;
protected ModelNode runtimeMapAttributeValue;
@Override
protected void initModel(ManagementModel managementModel) {
runtimeListAttributeValue = new ModelNode();
runtimeMapAttributeValue = new ModelNode();
ManagementResourceRegistration rootRegistration = managementModel.getRootResourceRegistration();
// register the global operations to be able to call :read-attribute and :write-attribute
GlobalOperationHandlers.registerGlobalOperations(rootRegistration, processType);
// register the global notifications so there is no warning that emitted notifications are not described by the resource.
GlobalNotifications.registerGlobalNotifications(rootRegistration, processType);
rootRegistration.registerOperationHandler(CompositeOperationHandler.DEFINITION, CompositeOperationHandler.INSTANCE);
ResourceDefinition profileDefinition = createProfileResourceDefinition();
rootRegistration.registerSubModel(profileDefinition);
}
protected abstract ResourceDefinition createProfileResourceDefinition();
@Test
public void testMapOperations() throws OperationFailedException {
executeCheckNoFailure(createOperation("add", TEST_ADDRESS));
ModelNode op = createOperation("map-put", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key");
op.get("value").set("map-value");
executeCheckNoFailure(op);
Map<String, String> map = PropertiesAttributeDefinition.unwrapModel(ExpressionResolver.TEST_RESOLVER, runtimeMapAttributeValue);
Assert.assertEquals(1, map.size());
Assert.assertEquals("map-value", map.get("map-key"));
executeCheckNoFailure(op);
op = createOperation("map-get", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key");
Assert.assertEquals("map-value", executeForResult(op).asString());
map = PropertiesAttributeDefinition.unwrapModel(ExpressionResolver.TEST_RESOLVER, runtimeMapAttributeValue);
Assert.assertEquals(1, map.size());
Assert.assertEquals("map-value", map.get("map-key"));
op = createOperation("map-put", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key");
op.get("value").set("map-value2");
executeCheckNoFailure(op);
//check for properly updated existing key
op = createOperation("map-get", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key");
Assert.assertEquals("map-value2", executeForResult(op).asString());
//add second entry
op = createOperation("map-put", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key2");
op.get("value").set("map-value2");
executeCheckNoFailure(op);
map = PropertiesAttributeDefinition.unwrapModel(ExpressionResolver.TEST_RESOLVER, runtimeMapAttributeValue);
Assert.assertEquals(2, map.size());
Assert.assertEquals("map-value2", map.get("map-key"));
Assert.assertEquals("map-value2", map.get("map-key2"));
//remove second entry
op = createOperation("map-remove", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key2");
executeCheckNoFailure(op);
map = PropertiesAttributeDefinition.unwrapModel(ExpressionResolver.TEST_RESOLVER, runtimeMapAttributeValue);
Assert.assertEquals(1, map.size());
Assert.assertEquals("map-value2", map.get("map-key"));
Assert.assertFalse(map.containsKey("map-key2"));
//clear map
op = createOperation("map-clear", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
executeCheckNoFailure(op);
map = PropertiesAttributeDefinition.unwrapModel(ExpressionResolver.TEST_RESOLVER, runtimeMapAttributeValue);
Assert.assertTrue(map.isEmpty());
}
@Test
public void testMapOperationsInComposite() throws OperationFailedException {
executeCheckNoFailure(createOperation("add", TEST_ADDRESS));
ModelNode composite = createOperation(COMPOSITE, PathAddress.EMPTY_ADDRESS);
ModelNode op = createOperation("map-put", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key1");
op.get("value").set("map-value1");
composite.get(STEPS).add(op);
op = createOperation("map-put", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key2");
op.get("value").set("map-value2");
composite.get(STEPS).add(op);
op = createOperation("map-put", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key3");
op.get("value").set("map-value3");
composite.get(STEPS).add(op);
op = createOperation("map-put", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key4");
op.get("value").set("map-value4");
composite.get(STEPS).add(op);
executeCheckNoFailure(composite);
Map<String, String> map = PropertiesAttributeDefinition.unwrapModel(ExpressionResolver.TEST_RESOLVER, runtimeMapAttributeValue);
Assert.assertEquals(4, map.size());
Assert.assertEquals("map-value1", map.get("map-key1"));
Assert.assertEquals("map-value2", map.get("map-key2"));
Assert.assertEquals("map-value3", map.get("map-key3"));
Assert.assertEquals("map-value4", map.get("map-key4"));
composite = createOperation(COMPOSITE, PathAddress.EMPTY_ADDRESS);
op = createOperation("map-remove", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key1");
composite.get(STEPS).add(op);
op = createOperation("map-remove", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key2");
composite.get(STEPS).add(op);
op = createOperation("map-remove", TEST_ADDRESS);
op.get("name").set(MAP_ATTRIBUTE_NAME);
op.get("key").set("map-key4");
composite.get(STEPS).add(op);
executeCheckNoFailure(composite);
map = PropertiesAttributeDefinition.unwrapModel(ExpressionResolver.TEST_RESOLVER, runtimeMapAttributeValue);
Assert.assertEquals(1, map.size());
Assert.assertEquals("map-value3", map.get("map-key3"));
}
@Test
public void testListOperations() throws OperationFailedException {
executeCheckNoFailure(createOperation("add", TEST_ADDRESS));
ModelNode op = createOperation("list-add", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("value").set("value1");
executeCheckNoFailure(op);
List<String> list = StringListAttributeDefinition.unwrapValue(ExpressionResolver.TEST_RESOLVER, runtimeListAttributeValue);
Assert.assertEquals(1, list.size());
Assert.assertEquals("value1", list.get(0));
//add second value
op.get("value").set("value2");
executeCheckNoFailure(op);
op = createOperation("list-get", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("index").set(0);
Assert.assertEquals("value1", executeForResult(op).asString());
op = createOperation("list-get", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("index").set(1);
Assert.assertEquals("value2", executeForResult(op).asString());
list = StringListAttributeDefinition.unwrapValue(ExpressionResolver.TEST_RESOLVER, runtimeListAttributeValue);
Assert.assertEquals(2, list.size());
Assert.assertEquals("value1", list.get(0));
Assert.assertEquals("value2", list.get(1));
//insert on index 0
op = createOperation("list-add", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("value").set("inserted");
op.get("index").set(0);
executeCheckNoFailure(op);
list = StringListAttributeDefinition.unwrapValue(ExpressionResolver.TEST_RESOLVER, runtimeListAttributeValue);
Assert.assertEquals(3, list.size());
Assert.assertEquals("inserted", list.get(0));
Assert.assertEquals("value1", list.get(1));
op = createOperation("list-get", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("index").set(0);
Assert.assertEquals("inserted", executeForResult(op).asString());
//remove by value
op = createOperation("list-remove", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("value").set("value1");
executeCheckNoFailure(op);
list = StringListAttributeDefinition.unwrapValue(ExpressionResolver.TEST_RESOLVER, runtimeListAttributeValue);
Assert.assertEquals(2, list.size());
Assert.assertEquals("inserted", list.get(0));
Assert.assertEquals("value2", list.get(1));
op = createOperation("list-get", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("index").set(1);
Assert.assertEquals("value2", executeForResult(op).asString());
//remove by index
op = createOperation("list-remove", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("index").set(0);
executeCheckNoFailure(op);
list = StringListAttributeDefinition.unwrapValue(ExpressionResolver.TEST_RESOLVER, runtimeListAttributeValue);
Assert.assertEquals(1, list.size());
Assert.assertEquals("value2", list.get(0));
//clear
op = createOperation("list-clear", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
executeCheckNoFailure(op);
list = StringListAttributeDefinition.unwrapValue(ExpressionResolver.TEST_RESOLVER, runtimeListAttributeValue);
Assert.assertTrue(list.isEmpty());
op = createOperation("list-add", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("value").set("one");
executeCheckNoFailure(op);
list = StringListAttributeDefinition.unwrapValue(ExpressionResolver.TEST_RESOLVER, runtimeListAttributeValue);
Assert.assertEquals(1, list.size());
/*op = createOperation("list-add", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE.getName());
op.get("value").set("one");*/
executeCheckForFailure(op); //duplicates not allowed
}
@Test
public void testListOperationsInComposite() throws OperationFailedException {
executeCheckNoFailure(createOperation("add", TEST_ADDRESS));
ModelNode composite = createOperation(COMPOSITE, PathAddress.EMPTY_ADDRESS);
ModelNode op = createOperation("list-add", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("value").set("value1");
composite.get(STEPS).add(op);
op = createOperation("list-add", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("value").set("value2");
composite.get(STEPS).add(op);
op = createOperation("list-add", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("value").set("value3");
composite.get(STEPS).add(op);
op = createOperation("list-add", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("value").set("value4");
composite.get(STEPS).add(op);
executeCheckNoFailure(composite);
List<String> list = StringListAttributeDefinition.unwrapValue(ExpressionResolver.TEST_RESOLVER, runtimeListAttributeValue);
Assert.assertEquals(4, list.size());
Assert.assertEquals("value1", list.get(0));
Assert.assertEquals("value2", list.get(1));
Assert.assertEquals("value3", list.get(2));
Assert.assertEquals("value4", list.get(3));
composite = createOperation(COMPOSITE, PathAddress.EMPTY_ADDRESS);
op = createOperation("list-remove", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("value").set("value4");
composite.get(STEPS).add(op);
op = createOperation("list-remove", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("value").set("value3");
composite.get(STEPS).add(op);
op = createOperation("list-remove", TEST_ADDRESS);
op.get("name").set(LIST_ATTRIBUTE_NAME);
op.get("value").set("value1");
composite.get(STEPS).add(op);
executeCheckNoFailure(composite);
list = StringListAttributeDefinition.unwrapValue(ExpressionResolver.TEST_RESOLVER, runtimeListAttributeValue);
Assert.assertEquals(1, list.size());
Assert.assertEquals("value2", list.get(0));
}
}