/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.superbiz.resource.jmx;
import org.apache.ziplock.maven.Mvn;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.EnterpriseArchive;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.superbiz.resource.jmx.resources.AlternativeMBean;
import org.superbiz.resource.jmx.resources.HelloMBean;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.management.Attribute;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
@RunWith(Arquillian.class)
public class JMXTest {
@EJB
private TestEjb ejb;
@EJB
private AlternativeEjb alternativeEjb;
@Deployment
public static EnterpriseArchive createDeployment() {
final JavaArchive ejbJar = new Mvn.Builder()
.name("jmx-ejb.jar")
.build(JavaArchive.class)
.addClass(JMXTest.class)
.addClass(TestEjb.class);
final EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class, "jmx.ear")
.addAsModule(ejbJar);
return ear;
}
@Test
public void testFactory() throws Exception {
final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
final ObjectName objectName = new ObjectName("superbiz.test:name=Hello");
Assert.assertNotNull(ejb);
Assert.assertEquals(20, mbs.getAttribute(objectName, "Count"));
Assert.assertEquals(20, ejb.getCount());
mbs.invoke(objectName, "increment", new Object[0], new String[0]);
Assert.assertEquals(21, mbs.getAttribute(objectName, "Count"));
Assert.assertEquals(21, ejb.getCount());
ejb.increment();
Assert.assertEquals(22, mbs.getAttribute(objectName, "Count"));
Assert.assertEquals(22, ejb.getCount());
Attribute attribute = new Attribute("Count", 12345);
mbs.setAttribute(objectName, attribute);
Assert.assertEquals(12345, mbs.getAttribute(objectName, "Count"));
Assert.assertEquals(12345, ejb.getCount());
ejb.setCount(23456);
Assert.assertEquals(23456, mbs.getAttribute(objectName, "Count"));
Assert.assertEquals(23456, ejb.getCount());
Assert.assertEquals("Hello, world", mbs.invoke(objectName, "greet", new Object[]{"world"}, new String[]{String.class.getName()}));
Assert.assertEquals("Hello, world", ejb.greet("world"));
}
@Test
public void testFactorySkipImpliedAttributes() throws Exception {
final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
final ObjectName objectName = new ObjectName("superbiz.test:name=Hello2");
Assert.assertEquals(20, mbs.getAttribute(objectName, "Count"));
mbs.invoke(objectName, "increment", new Object[0], new String[0]);
Assert.assertEquals(21, mbs.getAttribute(objectName, "Count"));
Attribute attribute = new Attribute("Count", 12345);
mbs.setAttribute(objectName, attribute);
Assert.assertEquals(12345, mbs.getAttribute(objectName, "Count"));
Assert.assertEquals("Hello, world", mbs.invoke(objectName, "greet", new Object[]{"world"}, new String[]{String.class.getName()}));
}
@Test
public void testPostConstruct() throws Exception {
final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
final ObjectName objectName = new ObjectName("superbiz.test:name=Alternative");
Assert.assertNotNull(alternativeEjb);
Assert.assertEquals(20, mbs.getAttribute(objectName, "Count"));
Assert.assertEquals(20, alternativeEjb.getCount());
mbs.invoke(objectName, "increment", new Object[0], new String[0]);
Assert.assertEquals(21, mbs.getAttribute(objectName, "Count"));
Assert.assertEquals(21, alternativeEjb.getCount());
alternativeEjb.increment();
Assert.assertEquals(22, mbs.getAttribute(objectName, "Count"));
Assert.assertEquals(22, alternativeEjb.getCount());
Attribute attribute = new Attribute("Count", 12345);
mbs.setAttribute(objectName, attribute);
Assert.assertEquals(12345, mbs.getAttribute(objectName, "Count"));
Assert.assertEquals(12345, alternativeEjb.getCount());
alternativeEjb.setCount(23456);
Assert.assertEquals(23456, mbs.getAttribute(objectName, "Count"));
Assert.assertEquals(23456, alternativeEjb.getCount());
Assert.assertEquals("Hello, world", mbs.invoke(objectName, "greet", new Object[]{"world"}, new String[]{String.class.getName()}));
Assert.assertEquals("Hello, world", alternativeEjb.greet("world"));
}
@Singleton
@Lock(LockType.READ)
public static class TestEjb {
@Resource(name = "jmx/Hello")
private HelloMBean helloMBean;
public String greet(String name) {
return helloMBean.greet(name);
}
public void setCount(int count) {
helloMBean.setCount(count);
}
public void increment() {
helloMBean.increment();
}
public int getCount() {
return helloMBean.getCount();
}
}
@Singleton
@Lock(LockType.READ)
public static class AlternativeEjb {
@Resource(name = "jmx/Alternative")
private AlternativeMBean alternativeMBean;
public String greet(String name) {
return alternativeMBean.greet(name);
}
public void setCount(int count) {
alternativeMBean.setCount(count);
}
public void increment() {
alternativeMBean.increment();
}
public int getCount() {
return alternativeMBean.getCount();
}
}
}