DescriptorSupport attrDescr1 = new DescriptorSupport(names1, values1);
ModelMBeanAttributeInfo attrInfo1 = new ModelMBeanAttributeInfo(attrName1, String.class.getName(), "", true, true, false, attrDescr1);
ModelMBeanInfoSupport info = new ModelMBeanInfoSupport(ModelMBeanTarget.class.getName(), "", new ModelMBeanAttributeInfo[]{attrInfo1}, null, null, null);
final MutableBoolean storeTester = new MutableBoolean(false);
RequiredModelMBean rmmb = new StoreTesterRMMB(storeTester);
rmmb.setModelMBeanInfo(info);
rmmb.setManagedResource(bean, "ObjectReference");
m_server.registerMBean(rmmb, name);
// Adding a attribute change notification listener
final MutableInteger listenerCount = new MutableInteger(0);
rmmb.addAttributeChangeNotificationListener(new NotificationListener()
{
public void handleNotification(Notification notification, Object handback)
{
listenerCount.set(listenerCount.get() + 1);
}
}, attrName1, null);
String value = "SET_FIRST_TIME";
Attribute attribute = new Attribute(attrName1, value);
m_server.setAttribute(name, attribute);
// check that has really been set
assertEquals(bean.getMutableContent(), value);
// check through MBeanServer
assertEquals(m_server.getAttribute(name, attrName1), value);
// check that listener has been called
assertEquals(listenerCount.get(), 1);
// There is no persistence settings, check that store was not called
assertFalse("Store should not have been called", storeTester.get());
// Adding a attribute change notification listener with
// null as attribute. test for bug #742389
NotificationListener dummyListener = new NotificationListener()
{
public void handleNotification(Notification notification, Object handback)
{
}
};
rmmb.addAttributeChangeNotificationListener(dummyListener, null, null);
rmmb.removeAttributeChangeNotificationListener(dummyListener, null);
// Change the persist policy - have to unregeister to call setModelMBeanInfo
m_server.unregisterMBean(name);
attrDescr1.setField("persistPolicy", "OnUpdate");
info.setDescriptor(attrDescr1, "attribute");
rmmb.setModelMBeanInfo(info);
storeTester.set(false);
m_server.registerMBean(rmmb, name);
value = "SET_SECOND_TIME";
attribute = new Attribute(attrName1, value);
m_server.setAttribute(name, attribute);
// check that listener has been called
assertEquals(listenerCount.get(), 2);
// There are persistence settings, check that store was called
assertTrue("Store should have been called", storeTester.get());
// Now remove setMethod - again we have to unregister
m_server.unregisterMBean(name);
names1 = new String[]{"name", "descriptorType", "value", "iterable", "displayName", "getMethod", "currencyTimeLimit"};
// changed to match the actual behaviour indicated in the specs about currencyTimeLimit
// currencyTimeLimit is now -1
values1 = new Object[]{attrName1, "attribute", null, "false", "", "get" + attrName1, "-1"};
attrDescr1 = new DescriptorSupport(names1, values1);
attrDescr1.setField("persistPolicy", "OnUpdate");
info.setDescriptor(attrDescr1, "attribute");
rmmb.setModelMBeanInfo(info);
storeTester.set(false);
m_server.registerMBean(rmmb, name);
value = "SET_THIRD_TIME";
attribute = new Attribute(attrName1, value);
m_server.setAttribute(name, attribute);
// check that listener has been called
assertEquals(listenerCount.get(), 3);
// There are persistence settings, check that store was called
assertTrue("Store should have been called", storeTester.get());
// Check the attribute value
if (bean.getMutableContent().equals(value))
{
fail("No setMethod, bean should not have been modified");
}