001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package test.compliance.modelmbean;
023:
024: import javax.management.Descriptor;
025: import javax.management.MBeanOperationInfo;
026: import javax.management.MBeanServer;
027: import javax.management.MBeanServerFactory;
028: import javax.management.ObjectName;
029: import javax.management.MBeanInfo;
030: import javax.management.NotificationListener;
031: import javax.management.Notification;
032: import javax.management.modelmbean.DescriptorSupport;
033: import javax.management.modelmbean.ModelMBean;
034: import javax.management.modelmbean.ModelMBeanAttributeInfo;
035: import javax.management.modelmbean.ModelMBeanInfo;
036: import javax.management.modelmbean.ModelMBeanInfoSupport;
037: import javax.management.modelmbean.ModelMBeanOperationInfo;
038: import javax.management.modelmbean.RequiredModelMBean;
039:
040: import junit.framework.TestCase;
041: import test.compliance.modelmbean.support.Resource;
042:
043: public class ModelMBeanTEST extends TestCase {
044: static class RMMListener implements NotificationListener {
045: public void handleNotification(Notification msg, Object handback) {
046: System.out.println("handleNotification, msg=" + msg);
047: }
048: }
049:
050: public ModelMBeanTEST(String s) {
051: super (s);
052: }
053:
054: public void testRequiredModelMBeanConstructors() {
055: try {
056: new RequiredModelMBean();
057: } catch (Throwable t) {
058: t.printStackTrace();
059: fail("Creating Required ModelMBean instance with default constructor failed: "
060: + t.toString());
061: }
062: }
063:
064: public void testRMMSetManagedResource() {
065: try {
066: ModelMBean modelmbean = new RequiredModelMBean();
067: Resource resource = new Resource();
068: modelmbean.setManagedResource(resource, "ObjectReference");
069: } catch (Throwable t) {
070: t.printStackTrace();
071: fail("Setting resource object with 'ObjectReference' type failed: "
072: + t.toString());
073: }
074: }
075:
076: public void testRMMSetManagedResourceAfterRegister()
077: throws Exception {
078: MBeanServer server = MBeanServerFactory.createMBeanServer();
079:
080: Resource resource = new Resource();
081: ModelMBean modelmbean = new RequiredModelMBean();
082: modelmbean.setModelMBeanInfo(getModelMBeanInfo());
083:
084: ObjectName name = new ObjectName("rmm:invocationTest=true");
085: server.registerMBean(modelmbean, name);
086:
087: modelmbean.setManagedResource(resource, "ObjectReference");
088:
089: MBeanInfo info = server.getMBeanInfo(name);
090: assertTrue("MBeanInfo != null", info != null);
091:
092: Object[] args = {};
093: String[] sig = {};
094: Boolean flag = (Boolean) server.invoke(name, "isActive", args,
095: sig);
096: assertTrue("isActive", flag.booleanValue());
097: }
098:
099: public void testRMMSetManagedResourceAfterRegisterViaServer()
100: throws Exception {
101: MBeanServer server = MBeanServerFactory.createMBeanServer();
102:
103: Resource resource = new Resource();
104: ModelMBean modelmbean = new RequiredModelMBean();
105: modelmbean.setModelMBeanInfo(getModelMBeanInfo());
106:
107: ObjectName name = new ObjectName("rmm:invocationTest=true");
108: server.registerMBean(modelmbean, name);
109:
110: Object[] args = { resource, "ObjectReference" };
111: String[] sig = { "java.lang.Object", "java.lang.String" };
112: server.invoke(name, "setManagedResource", args, sig);
113:
114: MBeanInfo info = server.getMBeanInfo(name);
115: assertTrue("MBeanInfo != null", info != null);
116:
117: args = new Object[] {};
118: sig = new String[] {};
119: Boolean flag = (Boolean) server.invoke(name, "isActive", args,
120: sig);
121: assertTrue("isActive", flag.booleanValue());
122: }
123:
124: public void testCreatedRMMSetManagedResourceAfterRegisterViaServer()
125: throws Exception {
126: MBeanServer server = MBeanServerFactory.createMBeanServer();
127: ObjectName name = new ObjectName("rmm:invocationTest=true");
128: ModelMBeanInfo info = getModelMBeanInfo();
129: Object[] ctorArgs = { info };
130: String[] ctorSig = { "javax.management.modelmbean.ModelMBeanInfo" };
131: server.createMBean(
132: "javax.management.modelmbean.RequiredModelMBean", name,
133: ctorArgs, ctorSig);
134:
135: Resource resource = new Resource();
136:
137: Object[] args = { resource, "ObjectReference" };
138: String[] sig = { "java.lang.Object", "java.lang.String" };
139: server.invoke(name, "setManagedResource", args, sig);
140:
141: info = (ModelMBeanInfo) server.getMBeanInfo(name);
142: assertTrue("MBeanInfo != null", info != null);
143:
144: args = new Object[] {};
145: sig = new String[] {};
146: Boolean flag = (Boolean) server.invoke(name, "isActive", args,
147: sig);
148: assertTrue("isActive", flag.booleanValue());
149: }
150:
151: public void testCreatedRMMSetManagedResourceAfterRegisterViaServerListener()
152: throws Exception {
153: MBeanServer server = MBeanServerFactory.createMBeanServer();
154: ObjectName name = new ObjectName("rmm:invocationTest=true");
155: ModelMBeanInfo info = getModelMBeanInfo();
156: Object[] ctorArgs = { info };
157: String[] ctorSig = { "javax.management.modelmbean.ModelMBeanInfo" };
158: server.createMBean(
159: "javax.management.modelmbean.RequiredModelMBean", name,
160: ctorArgs, ctorSig);
161:
162: Resource resource = new Resource();
163:
164: Object[] args = { resource, "objectReference" };
165: String[] sig = { "java.lang.Object", "java.lang.String" };
166: server.invoke(name, "setManagedResource", args, sig);
167:
168: RMMListener listener = new RMMListener();
169: server.addNotificationListener(name, listener, null, null);
170: }
171:
172: public void testRMMSetModelMBeanInfo() throws Exception {
173: ModelMBean modelmbean = new RequiredModelMBean();
174: modelmbean.setModelMBeanInfo(getModelMBeanInfo());
175: }
176:
177: public void testRMMInvocation() throws Exception {
178: MBeanServer server = MBeanServerFactory.createMBeanServer();
179:
180: Resource resource = new Resource();
181: ModelMBean modelmbean = new RequiredModelMBean();
182: modelmbean.setModelMBeanInfo(getModelMBeanInfo());
183: modelmbean.setManagedResource(resource, "ObjectReference");
184:
185: ObjectName name = new ObjectName("rmm:invocationTest=true");
186: server.registerMBean(modelmbean, name);
187:
188: MBeanInfo info = server.getMBeanInfo(name);
189: assertTrue("MBeanInfo != null", info != null);
190:
191: assertTrue(((Boolean) server.invoke(name, "isActive",
192: new Object[] {}, new String[] {})).booleanValue());
193: }
194:
195: public void testRMMDefault() throws Exception {
196: MBeanServer server = MBeanServerFactory.newMBeanServer();
197:
198: Resource resource = new Resource();
199: ModelMBean modelmbean = new RequiredModelMBean();
200: modelmbean.setManagedResource(resource, "ObjectReference");
201: modelmbean.setModelMBeanInfo(getModelMBeanInfo());
202:
203: ObjectName name = new ObjectName("rmm:test=default");
204: server.registerMBean(modelmbean, name);
205:
206: assertTrue("Should be the default room", server.getAttribute(
207: name, "Room").equals("D325"));
208: }
209:
210: public ModelMBeanInfo getModelMBeanInfo() {
211: final boolean READABLE = true;
212: final boolean WRITABLE = true;
213: final boolean BOOLEAN = true;
214:
215: // build 'RoomName' read-write attribute
216: Descriptor descr1 = new DescriptorSupport();
217: descr1.setField("name", "Room");
218: descr1.setField("descriptorType", "attribute");
219: descr1.setField("displayName", "Room Number");
220: descr1.setField("default", "D325");
221:
222: ModelMBeanAttributeInfo roomNameInfo = new ModelMBeanAttributeInfo(
223: "Room", // attribute name
224: String.class.getName(), // attribute type
225: "Room name or number.", // description
226: READABLE, WRITABLE, !BOOLEAN, // read write
227: descr1 // descriptor
228: );
229:
230: // build 'Active' read-only attribute
231: Descriptor descr2 = new DescriptorSupport();
232: descr2.setField("name", "Active");
233: descr2.setField("descriptorType", "attribute");
234: descr2.setField("getMethod", "isActive");
235: descr2.setField("currencyTimeLimit", "10");
236:
237: ModelMBeanAttributeInfo activeInfo = new ModelMBeanAttributeInfo(
238: "Active", boolean.class.getName(), "Printer state.",
239: READABLE, !WRITABLE, !BOOLEAN, descr2);
240:
241: // build 'isActive' getter operation
242: Descriptor descr3 = new DescriptorSupport();
243: descr3.setField("name", "isActive");
244: descr3.setField("descriptorType", "operation");
245: descr3.setField("role", "getter");
246:
247: ModelMBeanOperationInfo isActiveInfo = new ModelMBeanOperationInfo(
248: "isActive", // name & description
249: "Checks if the printer is currently active.", null, // signature
250: boolean.class.getName(), // return type
251: MBeanOperationInfo.INFO, // impact
252: descr3 // descriptor
253: );
254:
255: // MBean descriptor
256: Descriptor descr4 = new DescriptorSupport();
257: descr4.setField("name", RequiredModelMBean.class.getName());
258: descr4.setField("descriptorType", "MBean");
259:
260: // create ModelMBeanInfo
261: ModelMBeanInfo info = new ModelMBeanInfoSupport(
262: RequiredModelMBean.class.getName(), // class name
263: "Printer", // description
264: new ModelMBeanAttributeInfo[] { // attributes
265: roomNameInfo, activeInfo }, null, // constructors
266: new ModelMBeanOperationInfo[] { // operations
267: isActiveInfo }, null, // notifications
268: descr4 // descriptor
269: );
270:
271: return info;
272: }
273:
274: }
|