blob: 67c9a0045dfda6825b5e634ee42020d57d90bc70 [file] [log] [blame]
/*
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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 General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 5043762
* @summary Attribute existence check fails if
* RequiredModelMBean.addAttributeChangeNotificationListener
* is called with a non-existent attribute name and there are
* no other attributes.
* @author Yves Joan
* @author Eamonn McManus
* @run clean AddAttributeChangeNotificationListenerTest
* @run build AddAttributeChangeNotificationListenerTest
* @run main AddAttributeChangeNotificationListenerTest
*/
import java.lang.reflect.Method;
import javax.management.AttributeChangeNotification;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.ObjectName;
import javax.management.RuntimeOperationsException;
import javax.management.modelmbean.*;
/**
* We do invoke addAttributeChangeNotificationListener to add
* a listener on an attribute not defined in the ModelMBeanInfo
* of the RequiredModelMBean instance used.
*/
public class AddAttributeChangeNotificationListenerTest {
public static void main(String args[] ) {
AddAttributeChangeNotificationListenerTest test =
new AddAttributeChangeNotificationListenerTest();
try {
test.run(args);
} catch(Exception e) {
System.out.println("FAIL");
e.printStackTrace();
System.exit(1);
}
System.out.println("PASS");
}
private void run( String[] args) throws Exception {
int errCount = 0;
String testName = "AddAttributeChangeNotificationListenerTest0001";
ObjectName modelMBeanObjectName = null;
ModelMBeanInfo modelMBeanInfo = null;
MBeanServer mbeanserver = MBeanServerFactory.newMBeanServer();
String modelMBeanName = "RequiredModelMBean";
String modelMBeanClassName =
"javax.management.modelmbean.RequiredModelMBean";
modelMBeanObjectName =
new ObjectName("AddAttributeChangeNotificationListenerTest:type=" +
modelMBeanName);
System.out.println("Build a ModelMBeanInfo without attribute State");
modelMBeanInfo = createModelMBeanInfo();
System.out.println("Create and register a RequiredModelMBean " +
"with that MBeanInfo");
Object[] params = { modelMBeanInfo };
String[] sig = { "javax.management.modelmbean.ModelMBeanInfo" };
mbeanserver.createMBean(modelMBeanClassName,
modelMBeanObjectName,
params,
sig);
ModelMBeanListener aListener = new ModelMBeanListener();
// add an attribute change listener
System.out.println("Add an attribute change listener for State");
try {
mbeanserver.invoke(modelMBeanObjectName,
"addAttributeChangeNotificationListener",
(new Object[] {aListener, "State", null}),
(new String[] {"javax.management.NotificationListener",
"java.lang.String",
"java.lang.Object"}));
System.out.println("NOK: Did not get expected " +
"RuntimeOperationsException");
errCount++;
} catch (Exception e) {
if (e instanceof MBeanException)
e = ((MBeanException) e).getTargetException();
if (e instanceof RuntimeOperationsException) {
RuntimeOperationsException roe =
(RuntimeOperationsException) e;
Exception target = roe.getTargetException();
System.out.println("OK: Got expected RuntimeOperationsException");
if ( target instanceof IllegalArgumentException ) {
System.out.println("OK: Got expected " +
"wrapped IllegalArgumentException");
} else {
System.out.println("NOK: Got wrapped "
+ target
+ " as we expect IllegalArgumentException");
errCount++;
}
} else {
System.out.println("NOK: Got "
+ e
+ " as we expect RuntimeOperationsException");
errCount++;
}
}
if ( errCount != 0 )
throw new Exception(errCount
+ " error(s) occured");
}
/**
* Returns a ModelMBeanInfo with two operations:
* setManagedResource
* addAttributeChangeNotificationListener
*/
private ModelMBeanInfo createModelMBeanInfo() throws Exception {
// operation setManagedResource
String descriptionOp1Set = "ManagedResource description setter";
Class[] paramsSet1 = {Class.forName("java.lang.Object"),
Class.forName("java.lang.String")};
Method oper1Set =
RequiredModelMBean.class.getMethod("setManagedResource",
paramsSet1);
ModelMBeanOperationInfo operation1Set =
new ModelMBeanOperationInfo(descriptionOp1Set,
oper1Set);
// operation addAttributeChangeNotificationListener
String descriptionop2Set =
"addAttributeChangeNotificationListener description";
Class [] paramsSet2 =
{Class.forName("javax.management.NotificationListener"),
Class.forName("java.lang.String"),
Class.forName("java.lang.Object")};
Method oper2Set =
RequiredModelMBean.class.getMethod(
"addAttributeChangeNotificationListener",
paramsSet2);
ModelMBeanOperationInfo operation2Set =
new ModelMBeanOperationInfo(descriptionop2Set,
oper2Set);
// define ModelMBeanInfo
String className = "ModelMBeansInfo";
String descriptionmodel = "Model MBean Test";
ModelMBeanAttributeInfo[] attributes = null;
ModelMBeanOperationInfo[] operations = {
operation1Set,
operation2Set
};
ModelMBeanNotificationInfo[] notifications = null;
ModelMBeanConstructorInfo[] constructors = null;
ModelMBeanInfoSupport modelMBeanInfo =
new ModelMBeanInfoSupport(className,
descriptionmodel,
attributes,
constructors,
operations,
notifications);
return modelMBeanInfo;
}
public static class ModelMBeanListener implements NotificationListener {
public ModelMBeanListener() {
tally = 0;
}
public void handleNotification(Notification acn, Object handback) {
tally++;
}
public int getCount() {
return tally;
}
public int setCount(int newTally) {
tally = newTally;
return tally;
}
private int tally = 0;
}
}