/*
* JBoss, Home of Professional Open Source.
* Copyright 2011, 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 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.registry;
import static org.jboss.as.controller.registry.CoreManagementResourceRegistrationUnitTestCase.getOpDef;
import static org.junit.Assert.*;
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.ProcessType;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleResourceDefinition;
import org.jboss.as.controller.descriptions.NonResolvingResourceDescriptionResolver;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Test for AS7-2930 functionality.
*
* @author Brian Stansberry (c) 2011 Red Hat Inc.
*/
public class ExtendWildCardRegistrationUnitTestCase {
private static final PathElement parentWild = PathElement.pathElement("parent");
private static final PathElement parentExt = PathElement.pathElement("parent", "ext");
private static final PathElement childWild = PathElement.pathElement("child");
private static final PathElement childExt = PathElement.pathElement("child", "ext");
private static final PathElement childWildExt = PathElement.pathElement("child", "wild-ext");
private static final OperationStepHandler parentWildAttr = new TestOSH();
private static final OperationStepHandler parentExtAttr = new TestOSH();
private static final OperationStepHandler childWildAttr = new TestOSH();
private static final OperationStepHandler childExtAttr = new TestOSH();
private static final OperationStepHandler childWildExtAttr = new TestOSH();
private static final OperationStepHandler parentWildOverrideAttr = new TestOSH();
private static final OperationStepHandler parentExtOverrideAttr = new TestOSH();
private static final OperationStepHandler childWildOverrideAttr = new TestOSH();
private static final OperationStepHandler childExtOverrideAttr = new TestOSH();
private static final OperationStepHandler parentWildOp = new TestOSH();
private static final OperationStepHandler parentExtOp = new TestOSH();
private static final OperationStepHandler childWildOp = new TestOSH();
private static final OperationStepHandler childExtOp = new TestOSH();
private static final OperationStepHandler childWildExtOp = new TestOSH();
private static final OperationStepHandler parentWildOverrideOp = new TestOSH();
private static final OperationStepHandler parentExtOverrideOp = new TestOSH();
private static final OperationStepHandler childWildOverrideOp = new TestOSH();
private static final OperationStepHandler childExtOverrideOp = new TestOSH();
private static ManagementResourceRegistration registration;
private static ManagementResourceRegistration parentWildReg;
private static ManagementResourceRegistration parentExtReg;
private static ManagementResourceRegistration childWildReg;
private static ManagementResourceRegistration childWildExtReg;
private static ManagementResourceRegistration childExtReg;
private static final SimpleAttributeDefinition wildAttr = new SimpleAttributeDefinition("wildAttr", ModelType.STRING, true);
private static final SimpleAttributeDefinition overrideAttr = new SimpleAttributeDefinition("overrideAttr", ModelType.STRING, true);
private static final SimpleAttributeDefinition extAttr = new SimpleAttributeDefinition("extAttr", ModelType.STRING, true);
private static final SimpleAttributeDefinition wildExtAttr = new SimpleAttributeDefinition("wildExtAttr", ModelType.STRING, true);
@BeforeClass
public static void setup() {
registration = ManagementResourceRegistration.Factory.forProcessType(ProcessType.EMBEDDED_SERVER).createRegistration(new SimpleResourceDefinition(PathElement.pathElement("root","root"), new NonResolvingResourceDescriptionResolver()));
parentWildReg = registration.registerSubModel(new SimpleResourceDefinition(parentWild, new NonResolvingResourceDescriptionResolver()));
parentWildReg.registerReadOnlyAttribute(wildAttr, parentWildAttr);
parentWildReg.registerOperationHandler(getOpDef("wildOp"), parentWildOp);
parentWildReg.registerReadOnlyAttribute(overrideAttr, parentWildOverrideAttr);
parentWildReg.registerOperationHandler(getOpDef("overrideOp"), parentWildOverrideOp);
parentExtReg = registration.registerSubModel(new SimpleResourceDefinition(parentExt, new NonResolvingResourceDescriptionResolver()));
parentExtReg.registerReadOnlyAttribute(extAttr, parentExtAttr);
parentExtReg.registerOperationHandler(getOpDef("extOp"), parentExtOp);
parentExtReg.registerReadOnlyAttribute(overrideAttr, parentExtOverrideAttr);
parentExtReg.registerOperationHandler(getOpDef("overrideOp"), parentExtOverrideOp);
childWildReg = parentWildReg.registerSubModel(new SimpleResourceDefinition(childWild, new NonResolvingResourceDescriptionResolver()));
childWildReg.registerReadOnlyAttribute(wildAttr, childWildAttr);
childWildReg.registerOperationHandler(getOpDef("wildOp"), childWildOp);
childWildReg.registerReadOnlyAttribute(overrideAttr, childWildOverrideAttr);
childWildReg.registerOperationHandler(getOpDef("overrideOp"), childWildOverrideOp);
childWildExtReg = parentWildReg.registerSubModel(new SimpleResourceDefinition(childWildExt, new NonResolvingResourceDescriptionResolver()));
childWildExtReg.registerReadOnlyAttribute(wildExtAttr, childWildExtAttr);
childWildExtReg.registerOperationHandler(getOpDef("wildExtOp"), childWildExtOp);
childExtReg = parentExtReg.registerSubModel(new SimpleResourceDefinition(childExt, new NonResolvingResourceDescriptionResolver()));
childExtReg.registerReadOnlyAttribute(extAttr, childExtAttr);
childExtReg.registerOperationHandler(getOpDef("extOp"), childExtOp);
childExtReg.registerReadOnlyAttribute(overrideAttr, childExtOverrideAttr);
childExtReg.registerOperationHandler(getOpDef("overrideOp"), childExtOverrideOp);
}
@AfterClass
public static void tearDown() {
registration = null;
}
@Test
public void testParentWildcardAttribute() throws Exception {
assertSame(parentWildAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentWild), "wildAttr").getReadHandler());
assertSame(parentWildAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentExt), "wildAttr").getReadHandler());
assertSame(parentWildAttr, parentWildReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "wildAttr").getReadHandler());
assertSame(parentWildAttr, parentExtReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "wildAttr").getReadHandler());
}
@Test
public void testParentExtensionAttribute() throws Exception {
assertNull(registration.getAttributeAccess(PathAddress.pathAddress(parentWild), "extAttr"));
assertSame(parentExtAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentExt), "extAttr").getReadHandler());
assertNull(parentWildReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "extAttr"));
assertSame(parentExtAttr, parentExtReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "extAttr").getReadHandler());
}
@Test
public void testParentOverrideAttribute() throws Exception {
assertSame(parentWildOverrideAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentWild), "overrideAttr").getReadHandler());
assertSame(parentExtOverrideAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentExt), "overrideAttr").getReadHandler());
assertSame(parentWildOverrideAttr, parentWildReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "overrideAttr").getReadHandler());
assertSame(parentExtOverrideAttr, parentExtReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "overrideAttr").getReadHandler());
}
@Test
public void testParentMissingAttribute() throws Exception {
assertNull(registration.getAttributeAccess(PathAddress.pathAddress(parentWild), "na"));
assertNull(registration.getAttributeAccess(PathAddress.pathAddress(parentExt), "na"));
assertNull(parentWildReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "na"));
assertNull(parentExtReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "na"));
}
@Test
public void testParentWildcardOperation() throws Exception {
assertSame(parentWildOp, registration.getOperationHandler(PathAddress.pathAddress(parentWild), "wildOp"));
assertSame(parentWildOp, registration.getOperationHandler(PathAddress.pathAddress(parentExt), "wildOp"));
assertSame(parentWildOp, parentWildReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "wildOp"));
assertSame(parentWildOp, parentExtReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "wildOp"));
}
@Test
public void testParentExtensionOperation() throws Exception {
assertNull(registration.getOperationHandler(PathAddress.pathAddress(parentWild), "extOp"));
assertSame(parentExtOp, registration.getOperationHandler(PathAddress.pathAddress(parentExt), "extOp"));
assertNull(parentWildReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "extOp"));
assertSame(parentExtOp, parentExtReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "extOp"));
}
@Test
public void testParentOverrideOperation() throws Exception {
assertSame(parentWildOverrideOp, registration.getOperationHandler(PathAddress.pathAddress(parentWild), "overrideOp"));
assertSame(parentExtOverrideOp, registration.getOperationHandler(PathAddress.pathAddress(parentExt), "overrideOp"));
assertSame(parentWildOverrideOp, parentWildReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "overrideOp"));
assertSame(parentExtOverrideOp, parentExtReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "overrideOp"));
}
@Test
public void testParentMissingOperation() throws Exception {
assertNull(registration.getOperationHandler(PathAddress.pathAddress(parentWild), "na"));
assertNull(registration.getOperationHandler(PathAddress.pathAddress(parentExt), "na"));
assertNull(parentWildReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "na"));
assertNull(parentExtReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "na"));
}
@Test
public void testChildWildcardAttribute() throws Exception {
assertSame(childWildAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentWild, childWild), "wildAttr").getReadHandler());
assertSame(childWildAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentWild, childExt), "wildAttr").getReadHandler());
assertSame(childWildAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentWild, childWildExt), "wildAttr").getReadHandler());
assertSame(childWildAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentExt, childWild), "wildAttr").getReadHandler());
assertSame(childWildAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentExt, childExt), "wildAttr").getReadHandler());
assertSame(childWildAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentExt, childWildExt), "wildAttr").getReadHandler());
assertSame(childWildAttr, parentWildReg.getAttributeAccess(PathAddress.pathAddress(childWild), "wildAttr").getReadHandler());
assertSame(childWildAttr, parentExtReg.getAttributeAccess(PathAddress.pathAddress(childWild), "wildAttr").getReadHandler());
assertSame(childWildAttr, parentWildReg.getAttributeAccess(PathAddress.pathAddress(childExt), "wildAttr").getReadHandler());
assertSame(childWildAttr, parentExtReg.getAttributeAccess(PathAddress.pathAddress(childExt), "wildAttr").getReadHandler());
assertSame(childWildAttr, parentWildReg.getAttributeAccess(PathAddress.pathAddress(childWildExt), "wildAttr").getReadHandler());
assertSame(childWildAttr, parentExtReg.getAttributeAccess(PathAddress.pathAddress(childWildExt), "wildAttr").getReadHandler());
assertSame(childWildAttr, childWildReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "wildAttr").getReadHandler());
assertSame(childWildAttr, childExtReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "wildAttr").getReadHandler());
assertSame(childWildAttr, childWildExtReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "wildAttr").getReadHandler());
}
@Test
public void testChildExtensionAttribute() throws Exception {
assertNull(registration.getAttributeAccess(PathAddress.pathAddress(parentWild, childWild), "extAttr"));
assertNull(registration.getAttributeAccess(PathAddress.pathAddress(parentExt, childWild), "extAttr"));
assertNull(registration.getAttributeAccess(PathAddress.pathAddress(parentWild, childExt), "extAttr"));
assertNull(registration.getAttributeAccess(PathAddress.pathAddress(parentWild, childWildExt), "extAttr"));
assertSame(childExtAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentExt, childExt), "extAttr").getReadHandler());
assertNull(parentWildReg.getAttributeAccess(PathAddress.pathAddress(childWild), "extAttr"));
assertNull(parentExtReg.getAttributeAccess(PathAddress.pathAddress(childWild), "extAttr"));
assertNull(parentWildReg.getAttributeAccess(PathAddress.pathAddress(childExt), "extAttr"));
assertNull(parentWildReg.getAttributeAccess(PathAddress.pathAddress(childWildExt), "extAttr"));
assertSame(childExtAttr, parentExtReg.getAttributeAccess(PathAddress.pathAddress(childExt), "extAttr").getReadHandler());
assertNull(childWildReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "extAttr"));
assertNull(childWildExtReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "extAttr"));
assertSame(childExtAttr, childExtReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "extAttr").getReadHandler());
}
@Test
public void testChildOverrideAttribute() throws Exception {
assertSame(childWildOverrideAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentWild, childWild), "overrideAttr").getReadHandler());
assertSame(childWildOverrideAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentExt, childWild), "overrideAttr").getReadHandler());
assertSame(childWildOverrideAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentWild, childWildExt), "overrideAttr").getReadHandler());
assertSame(childWildOverrideAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentExt, childWildExt), "overrideAttr").getReadHandler());
assertSame(childWildOverrideAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentWild, childExt), "overrideAttr").getReadHandler());
assertSame(childExtOverrideAttr, registration.getAttributeAccess(PathAddress.pathAddress(parentExt, childExt), "overrideAttr").getReadHandler());
assertSame(childWildOverrideAttr, parentWildReg.getAttributeAccess(PathAddress.pathAddress(childWild), "overrideAttr").getReadHandler());
assertSame(childWildOverrideAttr, parentExtReg.getAttributeAccess(PathAddress.pathAddress(childWild), "overrideAttr").getReadHandler());
assertSame(childWildOverrideAttr, parentWildReg.getAttributeAccess(PathAddress.pathAddress(childWildExt), "overrideAttr").getReadHandler());
assertSame(childWildOverrideAttr, parentExtReg.getAttributeAccess(PathAddress.pathAddress(childWildExt), "overrideAttr").getReadHandler());
assertSame(childWildOverrideAttr, parentWildReg.getAttributeAccess(PathAddress.pathAddress(childExt), "overrideAttr").getReadHandler());
assertSame(childExtOverrideAttr, parentExtReg.getAttributeAccess(PathAddress.pathAddress(childExt), "overrideAttr").getReadHandler());
assertSame(childWildOverrideAttr, childWildReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "overrideAttr").getReadHandler());
assertSame(childWildOverrideAttr, childWildExtReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "overrideAttr").getReadHandler());
assertSame(childExtOverrideAttr, childExtReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "overrideAttr").getReadHandler());
}
@Test
public void testChildMissingAttribute() throws Exception {
assertNull(registration.getAttributeAccess(PathAddress.pathAddress(parentWild, childWild), "na"));
assertNull(registration.getAttributeAccess(PathAddress.pathAddress(parentExt, childWild), "na"));
assertNull(registration.getAttributeAccess(PathAddress.pathAddress(parentWild, childExt), "na"));
assertNull(registration.getAttributeAccess(PathAddress.pathAddress(parentExt, childExt), "na"));
assertNull(parentWildReg.getAttributeAccess(PathAddress.pathAddress(childWild), "na"));
assertNull(parentExtReg.getAttributeAccess(PathAddress.pathAddress(childWild), "na"));
assertNull(parentWildReg.getAttributeAccess(PathAddress.pathAddress(childExt), "na"));
assertNull(parentExtReg.getAttributeAccess(PathAddress.pathAddress(childExt), "na"));
assertNull(childWildReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "na"));
assertNull(childExtReg.getAttributeAccess(PathAddress.EMPTY_ADDRESS, "na"));
}
@Test
public void testChildWildcardOperation() throws Exception {
assertSame(childWildOp, registration.getOperationHandler(PathAddress.pathAddress(parentWild, childWild), "wildOp"));
assertSame(childWildOp, registration.getOperationHandler(PathAddress.pathAddress(parentExt, childWild), "wildOp"));
assertSame(childWildOp, registration.getOperationHandler(PathAddress.pathAddress(parentWild, childExt), "wildOp"));
assertSame(childWildOp, registration.getOperationHandler(PathAddress.pathAddress(parentExt, childExt), "wildOp"));
assertSame(childWildOp, parentWildReg.getOperationHandler(PathAddress.pathAddress(childWild), "wildOp"));
assertSame(childWildOp, parentExtReg.getOperationHandler(PathAddress.pathAddress(childWild), "wildOp"));
assertSame(childWildOp, parentWildReg.getOperationHandler(PathAddress.pathAddress(childExt), "wildOp"));
assertSame(childWildOp, parentExtReg.getOperationHandler(PathAddress.pathAddress(childExt), "wildOp"));
assertSame(childWildOp, childWildReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "wildOp"));
assertSame(childWildOp, childExtReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "wildOp"));
}
@Test
public void testChildExtensionOperation() throws Exception {
assertNull(registration.getOperationHandler(PathAddress.pathAddress(parentWild, childWild), "extOp"));
assertNull(registration.getOperationHandler(PathAddress.pathAddress(parentExt, childWild), "extOp"));
assertNull(registration.getOperationHandler(PathAddress.pathAddress(parentWild, childExt), "extOp"));
assertSame(childExtOp, registration.getOperationHandler(PathAddress.pathAddress(parentExt, childExt), "extOp"));
assertNull(parentWildReg.getOperationHandler(PathAddress.pathAddress(childWild), "extOp"));
assertNull(parentExtReg.getOperationHandler(PathAddress.pathAddress(childWild), "extOp"));
assertNull(parentWildReg.getOperationHandler(PathAddress.pathAddress(childExt), "extOp"));
assertSame(childExtOp, parentExtReg.getOperationHandler(PathAddress.pathAddress(childExt), "extOp"));
assertNull(childWildReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "extOp"));
assertSame(childExtOp, childExtReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "extOp"));
}
@Test
public void testChildOverrideOperation() throws Exception {
assertSame(childWildOverrideOp, registration.getOperationHandler(PathAddress.pathAddress(parentWild, childWild), "overrideOp"));
assertSame(childWildOverrideOp, registration.getOperationHandler(PathAddress.pathAddress(parentExt, childWild), "overrideOp"));
assertSame(childWildOverrideOp, registration.getOperationHandler(PathAddress.pathAddress(parentWild, childExt), "overrideOp"));
assertSame(childExtOverrideOp, registration.getOperationHandler(PathAddress.pathAddress(parentExt, childExt), "overrideOp"));
assertSame(childWildOverrideOp, parentWildReg.getOperationHandler(PathAddress.pathAddress(childWild), "overrideOp"));
assertSame(childWildOverrideOp, parentExtReg.getOperationHandler(PathAddress.pathAddress(childWild), "overrideOp"));
assertSame(childWildOverrideOp, parentWildReg.getOperationHandler(PathAddress.pathAddress(childExt), "overrideOp"));
assertSame(childExtOverrideOp, parentExtReg.getOperationHandler(PathAddress.pathAddress(childExt), "overrideOp"));
assertSame(childWildOverrideOp, childWildReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "overrideOp"));
assertSame(childExtOverrideOp, childExtReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "overrideOp"));
}
@Test
public void testChildMissingOperation() throws Exception {
assertNull(registration.getOperationHandler(PathAddress.pathAddress(parentWild, childWild), "na"));
assertNull(registration.getOperationHandler(PathAddress.pathAddress(parentExt, childWild), "na"));
assertNull(registration.getOperationHandler(PathAddress.pathAddress(parentWild, childExt), "na"));
assertNull(registration.getOperationHandler(PathAddress.pathAddress(parentExt, childExt), "na"));
assertNull(parentWildReg.getOperationHandler(PathAddress.pathAddress(childWild), "na"));
assertNull(parentExtReg.getOperationHandler(PathAddress.pathAddress(childWild), "na"));
assertNull(parentWildReg.getOperationHandler(PathAddress.pathAddress(childExt), "na"));
assertNull(parentExtReg.getOperationHandler(PathAddress.pathAddress(childExt), "na"));
assertNull(childWildReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "na"));
assertNull(childExtReg.getOperationHandler(PathAddress.EMPTY_ADDRESS, "na"));
}
@Test
public void testDuplicateSubModel() {
try {
parentExtReg.registerSubModel(new SimpleResourceDefinition(childWildExt, new NonResolvingResourceDescriptionResolver()));
fail("Duplicate child not rejected");
} catch (Exception good) {
//
}
try {
parentExtReg.registerSubModel(new SimpleResourceDefinition( childWild, new NonResolvingResourceDescriptionResolver()));
fail("Duplicate child not rejected");
} catch (Exception good) {
//
}
try {
parentWildReg.registerSubModel(new SimpleResourceDefinition(childWild, new NonResolvingResourceDescriptionResolver()));
fail("Duplicate child not rejected");
} catch (Exception good) {
//
}
}
private static class TestOSH implements OperationStepHandler {
@Override
public void execute(OperationContext context, ModelNode operation) throws OperationFailedException {
context.completeStep(OperationContext.RollbackHandler.NOOP_ROLLBACK_HANDLER);
}
}
}