/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* 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 4950756
* @summary Test that RequiredModelMBean.invoke will not invoke methods
* from the RequiredModelMBean class itself if they are not in the
* ModelMBeanInfo
* @author Eamonn McManus
* @run clean RequiredModelMBeanMethodTest
* @run build RequiredModelMBeanMethodTest
* @run main RequiredModelMBeanMethodTest
*/
import javax.management.*;
/*
* We do the same test with a number of different operations:
*
* - A plain operation that is directed to the managed resource in the
* usual way. We give it some parameters so we can test that the
* class loading logic for signature parameters is reasonable.
*
* - An operation (removeNotificationListener) that is directed to the
* RequiredModelMBean itself. We use this particular operation because
* it will throw an exception, which allows us to check that it did in
* fact execute.
*
* - An operation (load()) that has the same signature as a
* RequiredModelMBean operation but is directed to the resource
* because of a "class" field in the descriptor.
*
* - An operation (store()) that has the same signature as a
* RequiredModelMBean operation but is directed to the resource
* because of a "targetObject" field in the descriptor.
*
* In each case we check that the operation does not work if it is not
* in the ModelMBeanInfo, and does work if it is.
*/
public class RequiredModelMBeanMethodTest {
boolean ok = true;
new DescriptorSupport(new String[] {
"name=tralala",
"descriptorType=operation",
"role=operation",
"targetType=ObjectReference",
});
new Class[] {
NotificationListener.class,
String.class
});
new DescriptorSupport(new String[] {
"name=load",
"descriptorType=operation",
"role=operation",
"targetType=ObjectReference",
});
new MBeanParameterInfo[0],
new DescriptorSupport(new String[] {
"name=store",
"descriptorType=operation",
"role=operation",
"targetType=ObjectReference",
});
new MBeanParameterInfo[0],
"empty descr",
"ModelMBeanInfo");
try {
if (thisok)
else
ok = false;
} catch (Exception e) {
ok = false;
}
};
"full descr",
"ModelMBeanInfo");
"descriptor directs methods to resource");
try {
if (thisok)
else
ok = false;
} catch (Exception e) {
ok = false;
}
if (ok) {
ok = false;
}
}
// Test the invoke("class.method") form
if (ok) {
resource.loadCalled = false;
if (!resource.loadCalled) {
ok = false;
}
try {
RequiredModelMBean.class.getName() +
".removeAttributeChangeNotificationListener",
new String[] {
NotificationListener.class.getName(),
});
" returned successfully but " +
"should not have");
ok = false;
} catch (MBeanException e) {
if (target instanceof ListenerNotFoundException) {
// OK: there is no such listener
} else
throw e;
}
}
if (ok)
else {
}
}
boolean shouldWork)
throws Exception {
boolean ok = true;
"tralala",
"removeAttributeChangeNotificationListener",
"load",
"store",
};
for (int i = 0; i < 4; i++) {
boolean thisok = true;
try {
switch (i) {
case 0:
new String[] {"int",
tralala);
thisok = false;
}
break;
case 1:
try {
names[i],
new String[] {
NotificationListener.class.getName(),
});
" returned successfully but " +
"should not have");
thisok = false;
} catch (MBeanException e) {
if (target instanceof ListenerNotFoundException) {
// OK: there is no such listener
} else
throw e;
}
break;
case 2:
case 3:
names[i],
new Object[0],
new String[0]);
break;
default:
throw new AssertionError();
}
thisok = shouldWork;
if (!shouldWork) {
" worked but should not");
}
} catch (MBeanException e) {
if (shouldWork) {
thisok = false;
} else {
if (!(target instanceof ServiceNotFoundException)) {
": wrong exception: " + target);
thisok = false;
}
}
} catch (Exception e) {
thisok = false;
}
if (thisok)
else
ok = false;
}
return ok;
}
public static class Resource {
if (x != 5 || y != this)
return "wrong params: " + x + " " + y;
return "tralala";
}
public void load() {
loadCalled = true;
}
public void store() {
storeCalled = true;
}
}
new NotificationListener() {
}
};
}