jdk/test/javax/management/namespace/VirtualPropsTest.java
changeset 1156 bbc2d15aaf7a
child 1227 4546977d0d66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/management/namespace/VirtualPropsTest.java	Thu Sep 04 14:46:36 2008 +0200
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 5108776
+ * @summary Test the properties use case for Virtual MBeans that is documented
+ * in MBeanServerSupport.
+ * @author Eamonn McManus
+ */
+
+import java.lang.management.ManagementFactory;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.TimeUnit;
+import javax.management.DynamicMBean;
+import javax.management.InstanceNotFoundException;
+import javax.management.JMX;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.Notification;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationListener;
+import javax.management.ObjectName;
+import javax.management.StandardMBean;
+import javax.management.namespace.JMXNamespace;
+import javax.management.namespace.JMXNamespaces;
+import javax.management.namespace.VirtualEventManager;
+import javax.management.namespace.MBeanServerSupport;
+
+public class VirtualPropsTest {
+    public static interface PropertyMBean {
+        public String getValue();
+    }
+
+    public static class PropsMBS extends MBeanServerSupport {
+        private static ObjectName newObjectName(String name) {
+            try {
+                return new ObjectName(name);
+            } catch (MalformedObjectNameException e) {
+                throw new AssertionError(e);
+            }
+        }
+
+        public static class PropertyImpl implements PropertyMBean {
+            private final String name;
+
+            public PropertyImpl(String name) {
+                this.name = name;
+            }
+
+            public String getValue() {
+                return System.getProperty(name);
+            }
+        }
+
+        @Override
+        public DynamicMBean getDynamicMBeanFor(ObjectName name)
+                throws InstanceNotFoundException {
+            ObjectName namePattern = newObjectName(
+                        "com.example:type=Property,name=\"*\"");
+            if (!namePattern.apply(name))
+                throw new InstanceNotFoundException(name);
+
+            String propName = ObjectName.unquote(name.getKeyProperty("name"));
+            if (System.getProperty(propName) == null)
+                throw new InstanceNotFoundException(name);
+            PropertyMBean propMBean = new PropertyImpl(propName);
+            return new StandardMBean(propMBean, PropertyMBean.class, false);
+        }
+
+        @Override
+        protected Set<ObjectName> getNames() {
+            Set<ObjectName> names = new TreeSet<ObjectName>();
+            Properties props = System.getProperties();
+            for (String propName : props.stringPropertyNames()) {
+                ObjectName objectName = newObjectName(
+                        "com.example:type=Property,name=" +
+                        ObjectName.quote(propName));
+                names.add(objectName);
+            }
+            return names;
+        }
+
+        private final VirtualEventManager vem = new VirtualEventManager();
+
+        @Override
+        public NotificationEmitter getNotificationEmitterFor(
+                ObjectName name) throws InstanceNotFoundException {
+            getDynamicMBeanFor(name);  // check that the name is valid
+            return vem.getNotificationEmitterFor(name);
+        }
+
+        public void propertyChanged(String name, String newValue) {
+            ObjectName objectName = newObjectName(
+                    "com.example:type=Property,name=" + ObjectName.quote(name));
+            Notification n = new Notification(
+                    "com.example.property.changed", objectName, 0L,
+                    "Property " + name + " changed");
+            n.setUserData(newValue);
+            vem.publish(objectName, n);
+        }
+    }
+
+    static class QueueListener implements NotificationListener {
+        BlockingQueue<Notification> q = new ArrayBlockingQueue<Notification>(10);
+        public void handleNotification(Notification notification,
+                                       Object handback) {
+            q.add(notification);
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        MBeanServer mmbs = ManagementFactory.getPlatformMBeanServer();
+        String namespace = "props";
+        PropsMBS pmbs = new PropsMBS();
+        Object namespaceMBean = new JMXNamespace(pmbs);
+        mmbs.registerMBean(namespaceMBean, new ObjectName(
+                namespace + "//:type=JMXNamespace"));
+        MBeanServer mbs = JMXNamespaces.narrowToNamespace(mmbs, namespace);
+
+        Properties props = System.getProperties();
+
+        int nprops = props.stringPropertyNames().size();
+        if (nprops != mbs.getMBeanCount()) {
+            throw new Exception(String.format("Properties: %d; MBeans: %d",
+                    nprops, mbs.getMBeanCount()));
+        }
+
+        for (String propName : props.stringPropertyNames()) {
+            ObjectName propObjectName = new ObjectName(
+                    "com.example:type=Property,name=" + ObjectName.quote(propName));
+            PropertyMBean propProx = JMX.newMBeanProxy(
+                    mbs, propObjectName, PropertyMBean.class);
+            String propValue = propProx.getValue();
+            String realPropValue = props.getProperty(propName);
+            if (!realPropValue.equals(propValue)) {
+                throw new Exception(String.format("Property %s: value is \"%s\"; " +
+                        "mbean says \"%s\"", propName, realPropValue, propValue));
+            }
+        }
+
+        ObjectName fooPropObjectName =
+                new ObjectName("com.example:type=Property,name=\"java.home\"");
+        QueueListener ql = new QueueListener();
+        mbs.addNotificationListener(fooPropObjectName, ql, null, null);
+        pmbs.propertyChanged("java.home", "bar");
+        Notification n = ql.q.poll(1, TimeUnit.SECONDS);
+        if (n == null)
+            throw new Exception("Notif didn't arrive");
+        if (!"bar".equals(n.getUserData()))
+            throw new Exception("Bad user data: " + n.getUserData());
+
+        System.out.println("TEST PASSED");
+    }
+}