jdk/test/javax/management/Introspector/ResourceInjectionTest.java
changeset 4156 acaa49a2768a
parent 4155 460e37d40f12
child 4159 9e3aae7675f1
--- a/jdk/test/javax/management/Introspector/ResourceInjectionTest.java	Wed Oct 21 16:28:57 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,656 +0,0 @@
-/*
- * Copyright 2007-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 %M% %I%
- * @bug 6323980
- * @summary Test resource injection via @Resource
- * @author Eamonn McManus
- * @run main/othervm -ea ResourceInjectionTest
- */
-
-import java.io.File;
-import java.io.PrintWriter;
-import java.io.Serializable;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.Arrays;
-import javax.annotation.Resource;
-import javax.management.Attribute;
-import javax.management.AttributeList;
-import javax.management.AttributeNotFoundException;
-import javax.management.DynamicMBean;
-import javax.management.InstanceNotFoundException;
-import javax.management.MBean;
-import javax.management.MBeanException;
-import javax.management.MBeanInfo;
-import javax.management.MBeanRegistrationException;
-import javax.management.MBeanServer;
-import javax.management.MBeanServerFactory;
-import javax.management.MXBean;
-import javax.management.MalformedObjectNameException;
-import javax.management.ManagedAttribute;
-import javax.management.ManagedOperation;
-import javax.management.NotCompliantMBeanException;
-import javax.management.Notification;
-import javax.management.NotificationEmitter;
-import javax.management.NotificationListener;
-import javax.management.ObjectName;
-import javax.management.ReflectionException;
-import javax.management.SendNotification;
-import javax.management.StandardEmitterMBean;
-import javax.management.StandardMBean;
-import javax.management.openmbean.MXBeanMappingFactory;
-
-public class ResourceInjectionTest {
-    private static MBeanServer mbs;
-    private static final ObjectName objectName;
-    static {
-        try {
-            objectName = new ObjectName("test:type=Test");
-        } catch (MalformedObjectNameException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /* This is somewhat nasty.  In the current state of affairs, a
-     * StandardEmitterMBean can only get the
-     * MBeanServer to rewrite the source of a Notification from
-     * the originating object's reference to its ObjectName IF
-     * StandardEmitterMBean.getResource() returns a reference to the
-     * wrapped object.  By default it doesn't, and you need to specify
-     * the option below to make it do so.  We may hope that this is
-     * obscure enough for users to run into it rarely if ever.
-     */
-    private static final StandardMBean.Options withWrappedVisible;
-    private static final StandardMBean.Options withWrappedVisibleMX;
-    static {
-        withWrappedVisible = new StandardMBean.Options();
-        withWrappedVisible.setWrappedObjectVisible(true);
-        withWrappedVisibleMX = withWrappedVisible.clone();
-        withWrappedVisibleMX.setMXBeanMappingFactory(MXBeanMappingFactory.DEFAULT);
-    }
-
-    @Retention(RetentionPolicy.RUNTIME)
-    private static @interface ExpectException {
-        Class<? extends Exception> value();
-    }
-
-    public static void main(String[] args) throws Exception {
-        if (!ResourceInjectionTest.class.desiredAssertionStatus())
-            throw new Exception("Test must be run with -ea");
-
-        File policyFile = File.createTempFile("jmxperms", ".policy");
-        policyFile.deleteOnExit();
-        PrintWriter pw = new PrintWriter(policyFile);
-        pw.println("grant {");
-        pw.println("    permission javax.management.MBeanPermission \"*\", \"*\";");
-        pw.println("    permission javax.management.MBeanServerPermission \"*\";");
-        pw.println("    permission javax.management.MBeanTrustPermission \"*\";");
-        pw.println("};");
-        pw.close();
-
-        System.setProperty("java.security.policy", policyFile.getAbsolutePath());
-        System.setSecurityManager(new SecurityManager());
-
-        String failure = null;
-
-        for (Method m : ResourceInjectionTest.class.getDeclaredMethods()) {
-            if (Modifier.isStatic(m.getModifiers()) &&
-                    m.getName().startsWith("test") &&
-                    m.getParameterTypes().length == 0) {
-                ExpectException expexc = m.getAnnotation(ExpectException.class);
-                mbs = MBeanServerFactory.newMBeanServer();
-                try {
-                    m.invoke(null);
-                    if (expexc != null) {
-                        failure =
-                                m.getName() + " did not got expected exception " +
-                                expexc.value().getName();
-                        System.out.println(failure);
-                    } else
-                        System.out.println(m.getName() + " OK");
-                } catch (InvocationTargetException ite) {
-                    Throwable t = ite.getCause();
-                    String prob = null;
-                    if (expexc != null) {
-                        if (expexc.value().isInstance(t)) {
-                            System.out.println(m.getName() + " OK (got expected " +
-                                    expexc.value().getName() + ")");
-                        } else
-                            prob = "got wrong exception";
-                    } else
-                        prob = "got exception";
-                    if (prob != null) {
-                        failure = m.getName() + ": " + prob + " " +
-                                t.getClass().getName();
-                        System.out.println(failure);
-                        t.printStackTrace(System.out);
-                    }
-                }
-            }
-        }
-        if (failure == null)
-            System.out.println("TEST PASSED");
-        else
-            throw new Exception("TEST FAILED: " + failure);
-    }
-
-    private static interface Send {
-        public void send();
-    }
-
-    // Test @Resource in MBean defined by annotations
-
-    @MBean
-    public static class Annotated {
-        @Resource
-        private volatile MBeanServer mbeanServer;
-        @Resource
-        private volatile ObjectName myName;
-
-        @ManagedAttribute
-        public ObjectName getMyName() {
-            return myName;
-        }
-
-        @ManagedOperation
-        public void unregisterSelf()
-        throws InstanceNotFoundException, MBeanRegistrationException {
-            mbeanServer.unregisterMBean(myName);
-        }
-    }
-
-    private static void testAnnotated() throws Exception {
-        testMBean(new Annotated());
-    }
-
-    private static void testAnnotatedWrapped() throws Exception {
-        testMBean(new StandardMBean(new Annotated(), null));
-    }
-
-    @MBean
-    public static class AnnotatedSend extends Annotated implements Send {
-        @Resource
-        private volatile SendNotification sender;
-
-        @ManagedOperation
-        public void send() {
-            sender.sendNotification(new Notification("type", this, 0L));
-        }
-    }
-
-    private static void testAnnotatedSend() throws Exception {
-        testMBean(new AnnotatedSend());
-    }
-
-    private static void testAnnotatedSendWrapped() throws Exception {
-        testMBean(new StandardEmitterMBean(
-                new AnnotatedSend(), null, withWrappedVisible, null));
-    }
-
-    // Test @Resource in MXBean defined by annotations
-
-    @MXBean
-    public static class AnnotatedMX {
-        @Resource
-        private volatile MBeanServer mbeanServer;
-        @Resource
-        private volatile ObjectName myName;
-
-        @ManagedAttribute
-        public ObjectName getMyName() {
-            return myName;
-        }
-
-        @ManagedOperation
-        public void unregisterSelf()
-        throws InstanceNotFoundException, MBeanRegistrationException {
-            mbeanServer.unregisterMBean(myName);
-        }
-    }
-
-    private static void testAnnotatedMX() throws Exception {
-        testMBean(new AnnotatedMX());
-    }
-
-    private static void testAnnotatedMXWrapped() throws Exception {
-        testMBean(new StandardMBean(new AnnotatedMX(), null, true));
-    }
-
-    public static class AnnotatedMXSend extends AnnotatedMX implements Send {
-        @Resource
-        private volatile SendNotification sender;
-
-        @ManagedOperation
-        public void send() {
-            sender.sendNotification(new Notification("type", this, 0L));
-        }
-    }
-
-    private static void testAnnotatedMXSend() throws Exception {
-        testMBean(new AnnotatedMXSend());
-    }
-
-    private static void testAnnotatedMXSendWrapped() throws Exception {
-        testMBean(new StandardEmitterMBean(
-                new AnnotatedMXSend(), null, withWrappedVisibleMX, null));
-    }
-
-    // Test @Resource in Standard MBean
-
-    public static interface SimpleStandardMBean {
-        public ObjectName getMyName();
-        public void unregisterSelf() throws Exception;
-    }
-
-    public static class SimpleStandard implements SimpleStandardMBean {
-        @Resource(type = MBeanServer.class)
-        private volatile Object mbeanServer;
-        @Resource(type = ObjectName.class)
-        private volatile Object myName;
-
-        public ObjectName getMyName() {
-            return (ObjectName) myName;
-        }
-
-        public void unregisterSelf() throws Exception {
-            ((MBeanServer) mbeanServer).unregisterMBean(getMyName());
-        }
-    }
-
-    private static void testStandard() throws Exception {
-        testMBean(new SimpleStandard());
-    }
-
-    private static void testStandardWrapped() throws Exception {
-        testMBean(new StandardMBean(new SimpleStandard(), SimpleStandardMBean.class));
-    }
-
-    public static interface SimpleStandardSendMBean extends SimpleStandardMBean {
-        public void send();
-    }
-
-    public static class SimpleStandardSend
-            extends SimpleStandard implements SimpleStandardSendMBean {
-        @Resource(type = SendNotification.class)
-        private volatile Object sender;
-
-        public void send() {
-            ((SendNotification) sender).sendNotification(
-                    new Notification("type", this, 0L));
-        }
-    }
-
-    private static void testStandardSend() throws Exception {
-        testMBean(new SimpleStandardSend());
-    }
-
-    private static void testStandardSendWrapped() throws Exception {
-        testMBean(new StandardEmitterMBean(
-                new SimpleStandardSend(), SimpleStandardSendMBean.class,
-                withWrappedVisible, null));
-    }
-
-    // Test @Resource in MXBean
-
-    public static interface SimpleMXBean {
-        public ObjectName getMyName();
-        public void unregisterSelf() throws Exception;
-    }
-
-    public static class SimpleMX implements SimpleMXBean {
-        @Resource(type = MBeanServer.class)
-        private volatile Object mbeanServer;
-        @Resource(type = ObjectName.class)
-        private volatile Object myName;
-
-        public ObjectName getMyName() {
-            return (ObjectName) myName;
-        }
-
-        public void unregisterSelf() throws Exception {
-            ((MBeanServer) mbeanServer).unregisterMBean(getMyName());
-        }
-    }
-
-    private static void testMX() throws Exception {
-        testMBean(new SimpleMX());
-    }
-
-    private static void testMXWrapped() throws Exception {
-        testMBean(new StandardMBean(new SimpleMX(), SimpleMXBean.class, true));
-    }
-
-    public static interface SimpleMXBeanSend extends SimpleMXBean {
-        public void send();
-    }
-
-    public MBeanServer getMbs() {
-        return mbs;
-    }
-
-    public static class SimpleMXSend extends SimpleMX implements SimpleMXBeanSend {
-        @Resource(type = SendNotification.class)
-        private volatile Object sender;
-
-        public void send() {
-            ((SendNotification) sender).sendNotification(
-                    new Notification("type", this, 0L));
-        }
-    }
-
-    private static void testMXSend() throws Exception {
-        testMBean(new SimpleMXSend());
-    }
-
-    private static void testMXSendWrapped() throws Exception {
-        testMBean(new StandardEmitterMBean(
-                new SimpleMXSend(), SimpleMXBeanSend.class,
-                withWrappedVisibleMX, null));
-    }
-
-    // Test @Resource in Dynamic MBean
-
-    private static class SimpleDynamic implements DynamicMBean {
-        private MBeanServer mbeanServer;
-        private ObjectName myName;
-
-        @Resource
-        private synchronized void setMBeanServer(MBeanServer mbs) {
-            mbeanServer = mbs;
-        }
-
-        @Resource(type = ObjectName.class)
-        private synchronized void setObjectName(Serializable name) {
-            myName = (ObjectName) name;
-        }
-
-        public synchronized Object getAttribute(String attribute)
-        throws AttributeNotFoundException {
-            if (attribute.equals("MyName"))
-                return myName;
-            throw new AttributeNotFoundException(attribute);
-        }
-
-        public void setAttribute(Attribute attribute)
-        throws AttributeNotFoundException {
-            throw new AttributeNotFoundException(attribute.getName());
-        }
-
-        public synchronized AttributeList getAttributes(String[] attributes) {
-            AttributeList list = new AttributeList();
-            for (String name : attributes) {
-                if (name.equals("MyName"))
-                    list.add(new Attribute("MyName", myName));
-            }
-            return list;
-        }
-
-        public AttributeList setAttributes(AttributeList attributes) {
-            return new AttributeList();
-        }
-
-        public synchronized Object invoke(
-                String actionName, Object[] params, String[] signature)
-        throws MBeanException, ReflectionException {
-            if (actionName.equals("unregisterSelf") &&
-                    (params == null || params.length == 0) &&
-                    (signature == null || signature.length == 0)) {
-                try {
-                    mbeanServer.unregisterMBean(myName);
-                    return null;
-                } catch (Exception x) {
-                    throw new MBeanException(x);
-                }
-            } else {
-                Exception x = new NoSuchMethodException(
-                        actionName + Arrays.toString(signature));
-                throw new MBeanException(x);
-            }
-        }
-
-        public MBeanInfo getMBeanInfo() {
-            DynamicMBean mbean = new StandardMBean(
-                    new SimpleStandard(), SimpleStandardMBean.class, false);
-            return mbean.getMBeanInfo();
-        }
-    }
-
-    private static void testDynamic() throws Exception {
-        testMBean(new SimpleDynamic());
-    }
-
-    private static class SimpleDynamicSend extends SimpleDynamic {
-        private SendNotification sender;
-
-        @Resource
-        private synchronized void setSender(SendNotification sender) {
-            this.sender = sender;
-        }
-
-        @Override
-        public synchronized Object invoke(
-                String actionName, Object[] params, String[] signature)
-        throws MBeanException, ReflectionException {
-            if (actionName.equals("send")) {
-                sender.sendNotification(new Notification("type", this, 0L));
-                return null;
-            } else
-                return super.invoke(actionName, params, signature);
-        }
-    }
-
-    private static void testDynamicSend() throws Exception {
-        testMBean(new SimpleDynamicSend());
-    }
-
-    // Test that @Resource classes don't have to be public
-    // They can even be defined within methods!
-    // But you can't have any @ManagedAttributes or @ManagedOperations
-    // in such MBeans so their utility is limited.
-
-    private static void testNonPublic() throws Exception {
-        @MBean
-        class NonPublic {
-            @Resource
-            ObjectName myName;
-        }
-        assert !Modifier.isPublic(NonPublic.class.getModifiers());
-        NonPublic mbean = new NonPublic();
-        mbs.registerMBean(mbean, objectName);
-        assert objectName.equals(mbean.myName);
-    }
-
-    // Test inheritance and multiple injections of the same value
-
-    private static class ManyResources extends AnnotatedSend {
-        @Resource
-        private volatile ObjectName myName;  // same name as in parent!
-        @Resource(type=ObjectName.class)
-        private volatile Object myOtherName;
-        private volatile ObjectName myThirdName;
-        private volatile ObjectName myFourthName;
-        private volatile int methodCalls;
-        @Resource
-        private volatile SendNotification send1;
-        @Resource(type = SendNotification.class)
-        private volatile Object send2;
-
-        @Resource
-        void setMyName(ObjectName name) {
-            myThirdName = name;
-            methodCalls++;
-        }
-
-        @Resource(type=ObjectName.class)
-        private void setMyNameAgain(ObjectName name) {
-            myFourthName = name;
-            methodCalls++;
-        }
-
-        void check() {
-            assert objectName.equals(myName) : myName;
-            for (ObjectName name : new ObjectName[] {
-                (ObjectName)myOtherName, myThirdName, myFourthName
-            }) {
-                assert myName == name : name;
-            }
-            assert methodCalls == 2 : methodCalls;
-            assert send1 != null && send2 == send1;
-        }
-    }
-
-    private static void testManyResources() throws Exception {
-        ManyResources mr = new ManyResources();
-        testMBean(mr);
-        mr.check();
-    }
-
-    // Test that method override doesn't lead to multiple calls of the same method
-
-    private static class ManyResourcesSub extends ManyResources {
-        private boolean called;
-
-        @Override
-        @Resource
-        void setMyName(ObjectName name) {
-            super.setMyName(name);
-            called = true;
-        }
-
-        void check2() {
-            assert called;
-        }
-    }
-
-    private static void testOverride() throws Exception {
-        ManyResourcesSub mrs = new ManyResourcesSub();
-        testMBean(mrs);
-        mrs.check();
-        mrs.check2();
-    }
-
-    // Test that @Resource is illegal on static fields
-
-    @MBean
-    public static class StaticResource {
-        @Resource
-        private static ObjectName name;
-    }
-
-    @ExpectException(NotCompliantMBeanException.class)
-    private static void testStaticResource() throws Exception {
-        testMBean(new StaticResource());
-    }
-
-    // Test that @Resource is illegal on static methods
-
-    @MBean
-    public static class StaticResourceMethod {
-        @Resource
-        private static void setObjectName(ObjectName name) {}
-    }
-
-    @ExpectException(NotCompliantMBeanException.class)
-    private static void testStaticResourceMethod() throws Exception {
-        testMBean(new StaticResourceMethod());
-    }
-
-    // Test that @Resource is illegal on methods that don't return void
-
-    @MBean
-    public static class NonVoidMethod {
-        @Resource
-        private String setObjectName(ObjectName name) {
-            return "oops";
-        }
-    }
-
-    @ExpectException(NotCompliantMBeanException.class)
-    private static void testNonVoidMethod() throws Exception {
-        testMBean(new NonVoidMethod());
-    }
-
-    // Test that @Resource is illegal on methods with no arguments
-
-    @MBean
-    public static class NoArgMethod {
-        @Resource(type=ObjectName.class)
-        private void setObjectName() {}
-    }
-
-    @ExpectException(NotCompliantMBeanException.class)
-    private static void testNoArgMethod() throws Exception {
-        testMBean(new NoArgMethod());
-    }
-
-    // Test that @Resource is illegal on methods with more than one argument
-
-    @MBean
-    public static class MultiArgMethod {
-        @Resource
-        private void setObjectName(ObjectName name, String what) {}
-    }
-
-    @ExpectException(NotCompliantMBeanException.class)
-    private static void testMultiArgMethod() throws Exception {
-        testMBean(new MultiArgMethod());
-    }
-
-    private static class CountListener implements NotificationListener {
-        volatile int count;
-        public void handleNotification(Notification notification, Object handback) {
-            count++;
-        }
-    }
-
-    private static void testMBean(Object mbean) throws Exception {
-        mbs.registerMBean(mbean, objectName);
-
-        final ObjectName name = (ObjectName) mbs.getAttribute(objectName, "MyName");
-        assert objectName.equals(name) : name;
-
-        if (mbean instanceof Send || mbean instanceof NotificationEmitter) {
-            assert mbs.isInstanceOf(name, NotificationEmitter.class.getName());
-            CountListener countL = new CountListener();
-            mbs.addNotificationListener(name, countL, null, null);
-            NotificationListener checkSource = new NotificationListener() {
-                public void handleNotification(Notification n, Object h) {
-                    assert n.getSource().equals(name) : n.getSource();
-                }
-            };
-            mbs.addNotificationListener(name, checkSource, null, null);
-            mbs.invoke(objectName, "send", null, null);
-            assert countL.count == 1;
-            mbs.removeNotificationListener(name, checkSource);
-            mbs.removeNotificationListener(name, countL, null, null);
-        }
-
-        mbs.invoke(objectName, "unregisterSelf", null, null);
-        assert !mbs.isRegistered(objectName);
-    }
-}