/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, 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.jmx.model;
import static org.jboss.as.controller.PathElement.pathElement;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.management.ObjectName;
import org.jboss.as.controller.PathAddress;
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.SimpleResourceDefinition;
import org.jboss.as.controller.descriptions.NonResolvingResourceDescriptionResolver;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.as.controller.registry.Resource;
import org.jboss.dmr.ModelNode;
import org.junit.Assert;
import org.junit.Test;
/**
*
* @author <a href="kabir.khan@jboss.com">Kabir Khan</a>
*/
public class ObjectNameAddressUtilTestCase {
static final String TOP = "top";
static final String ONE = "one";
static final String BOTTOM = "bottom";
static final String TWO = "two";
static final String COMPLEX_KEY = "*";
static final String COMPLEX_VALUE = "\":=*?\n {}[] \":=*?\n";
static final PathElement TOP_ONE = pathElement(TOP, ONE);
static final PathElement BOTTOM_TWO = pathElement(BOTTOM, TWO);
static final PathElement TOP_COMPLEX_VALUE = pathElement(TOP, COMPLEX_VALUE);
static final PathElement COMPLEX_KEY_ONE = pathElement(COMPLEX_KEY, ONE);
static final ResourceDefinition rootResourceDef = ResourceBuilder.Factory.create(PathElement.pathElement("test"), NonResolvingResourceDescriptionResolver.INSTANCE).build();
static final Resource rootResource;
static{
Resource root = new TestResource();
Resource topOne = new TestResource();
root.registerChild(TOP_ONE, topOne);
topOne.registerChild(BOTTOM_TWO, new TestResource());
root.registerChild(TOP_COMPLEX_VALUE, new TestResource());
root.registerChild(COMPLEX_KEY_ONE, new TestResource());
rootResource = root;
}
@Test
public void testSimpleAddress() throws Exception {
checkObjectName(TOP_ONE, BOTTOM_TWO);
}
@Test
public void testComplexValueAddress() throws Exception {
checkObjectName(TOP_COMPLEX_VALUE);
}
@Test
public void testComplexKeyAddress() throws Exception {
checkObjectName(COMPLEX_KEY_ONE);
}
private void checkObjectName(PathElement...elements) {
PathAddress pathAddress = PathAddress.pathAddress(elements);
ObjectName on = ObjectNameAddressUtil.createObjectName("jboss.as", pathAddress);
Assert.assertNotNull(on);
PathAddress resolved = ObjectNameAddressUtil.resolvePathAddress("jboss.as", rootResource, on);
Assert.assertEquals(pathAddress, resolved);
}
@Test
public void testToPathAddress() {
NonResolvingResourceDescriptionResolver resolver = new NonResolvingResourceDescriptionResolver();
ManagementResourceRegistration rootRegistration = ManagementResourceRegistration.Factory.forProcessType(ProcessType.EMBEDDED_SERVER).createRegistration(rootResourceDef);
ManagementResourceRegistration subsystemRegistration = rootRegistration.registerSubModel(new SimpleResourceDefinition(pathElement("subsystem", "foo"), resolver));
ManagementResourceRegistration resourceRegistration = subsystemRegistration.registerSubModel(new SimpleResourceDefinition(pathElement("resource", "resourceA"), resolver));
ManagementResourceRegistration subresourceRegistration = resourceRegistration.registerSubModel(new SimpleResourceDefinition(pathElement("subresource", "resourceB"), resolver));
PathAddress pathAddress = PathAddress.pathAddress("subsystem", "foo")
.append("resource", "resourceA")
.append("subresource", "resourceB");
ObjectName on = ObjectNameAddressUtil.createObjectName("jboss.as", pathAddress);
PathAddress convertedAddress = ObjectNameAddressUtil.toPathAddress("jboss.as", rootRegistration, on);
Assert.assertNotNull(convertedAddress);
Assert.assertEquals(pathAddress, convertedAddress);
}
private static class TestResource implements Resource {
private Map<String, Map<String, Resource>> children = new HashMap<String, Map<String,Resource>>();
@Override
public Resource getChild(PathElement element) {
Map<String, Resource> resources = children.get(element.getKey());
if (resources != null) {
return resources.get(element.getValue());
}
return null;
}
@Override
public void registerChild(PathElement address, Resource resource) {
Map<String, Resource> resources = children.get(address.getKey());
if (resources == null) {
resources = new HashMap<String, Resource>();
children.put(address.getKey(), resources);
}
resources.put(address.getValue(), resource);
}
@Override
public void registerChild(PathElement address, int index, Resource resource) {
throw new UnsupportedOperationException();
}
//THe rest of these don't currently get called
@Override
public void writeModel(ModelNode newModel) {
}
@Override
public Resource requireChild(PathElement element) {
return null;
}
@Override
public Resource removeChild(PathElement address) {
return null;
}
@Override
public Resource navigate(PathAddress address) {
return null;
}
@Override
public boolean isRuntime() {
return false;
}
@Override
public boolean isProxy() {
return false;
}
@Override
public Set<String> getOrderedChildTypes() {
return Collections.emptySet();
}
@Override
public boolean isModelDefined() {
return false;
}
@Override
public boolean hasChildren(String childType) {
return false;
}
@Override
public boolean hasChild(PathElement element) {
return false;
}
@Override
public ModelNode getModel() {
return null;
}
@Override
public Set<String> getChildrenNames(String childType) {
return null;
}
@Override
public Set<ResourceEntry> getChildren(String childType) {
return null;
}
@Override
public Set<String> getChildTypes() {
return null;
}
public Resource clone() {
return this;
}
};
}