jdk/src/share/classes/com/sun/jmx/mbeanserver/NotificationMBeanSupport.java
author xdono
Wed, 02 Jul 2008 12:55:45 -0700
changeset 715 f16baef3a20e
parent 687 874e25a9844a
permissions -rw-r--r--
6719955: Update copyright year Summary: Update copyright year for files that have been modified in 2008 Reviewed-by: ohair, tbell
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
287
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
     1
/*
715
f16baef3a20e 6719955: Update copyright year
xdono
parents: 687
diff changeset
     2
 * Copyright 2007-2008 Sun Microsystems, Inc.  All Rights Reserved.
287
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
     4
 *
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Sun designates this
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
     9
 * by Sun in the LICENSE file that accompanied this code.
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    10
 *
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    15
 * accompanied this code).
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    16
 *
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    20
 *
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    21
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    22
 * CA 95054 USA or visit www.sun.com if you need additional information or
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    23
 * have any questions.
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    24
 */
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    25
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    26
package com.sun.jmx.mbeanserver;
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    27
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    28
import java.lang.reflect.Method;
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    29
import java.util.ArrayList;
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    30
import java.util.List;
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    31
import javax.management.NotCompliantMBeanException;
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    32
import javax.management.Notification;
687
874e25a9844a 6562936: Support custom type mappings in MXBeans
emcmanus
parents: 287
diff changeset
    33
import javax.management.openmbean.MXBeanMappingFactory;
287
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    34
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    35
/**
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    36
 * <p>A variant of {@code StandardMBeanSupport} where the only
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    37
 * methods included are public getters.  This is used by
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    38
 * {@code QueryNotificationFilter} to pretend that a Notification is
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    39
 * an MBean so it can have a query evaluated on it.  Standard queries
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    40
 * never set attributes or invoke methods but custom queries could and
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    41
 * we don't want to allow that.  Also we don't want to fail if a
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    42
 * Notification happens to have inconsistent types in a pair of getX and
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    43
 * setX methods, and we want to include the Object.getClass() method.
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    44
 */
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    45
public class NotificationMBeanSupport extends StandardMBeanSupport {
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    46
    public <T extends Notification> NotificationMBeanSupport(T n)
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    47
            throws NotCompliantMBeanException {
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    48
        super(n, Util.<Class<T>>cast(n.getClass()));
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    49
    }
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    50
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    51
    @Override
687
874e25a9844a 6562936: Support custom type mappings in MXBeans
emcmanus
parents: 287
diff changeset
    52
    MBeanIntrospector<Method> getMBeanIntrospector(MXBeanMappingFactory ignored) {
287
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    53
        return introspector;
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    54
    }
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    55
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    56
    private static class Introspector extends StandardMBeanIntrospector {
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    57
        @Override
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    58
        void checkCompliance(Class<?> mbeanType) {}
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    59
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    60
        @Override
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    61
        List<Method> getMethods(final Class<?> mbeanType)
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    62
                throws Exception {
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    63
            List<Method> methods = new ArrayList<Method>();
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    64
            for (Method m : mbeanType.getMethods()) {
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    65
                String name = m.getName();
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    66
                Class<?> ret = m.getReturnType();
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    67
                if (m.getParameterTypes().length == 0) {
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    68
                    if ((name.startsWith("is") && name.length() > 2 &&
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    69
                            ret == boolean.class) ||
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    70
                        (name.startsWith("get") && name.length() > 3 &&
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    71
                            ret != void.class)) {
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    72
                        methods.add(m);
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    73
                    }
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    74
                }
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    75
            }
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    76
            return methods;
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    77
        }
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    78
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    79
    }
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    80
    private static final MBeanIntrospector<Method> introspector =
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    81
            new Introspector();
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents:
diff changeset
    82
}