jdk/src/share/classes/com/sun/jmx/mbeanserver/Util.java
author dfuchs
Thu, 04 Sep 2008 14:46:36 +0200
changeset 1156 bbc2d15aaf7a
parent 1004 5ba8217eb504
child 1222 78e3d021d528
permissions -rw-r--r--
5072476: RFE: support cascaded (federated) MBean Servers 6299231: Add support for named MBean Servers Summary: New javax.management.namespace package. Reviewed-by: emcmanus
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
715
f16baef3a20e 6719955: Update copyright year
xdono
parents: 287
diff changeset
     2
 * Copyright 2005-2008 Sun Microsystems, Inc.  All Rights Reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
90ce3da70b43 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Sun designates this
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
90ce3da70b43 Initial load
duke
parents:
diff changeset
     9
 * by Sun in the LICENSE file that accompanied this code.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    21
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    22
 * CA 95054 USA or visit www.sun.com if you need additional information or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    23
 * have any questions.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
package com.sun.jmx.mbeanserver;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    28
import com.sun.jmx.defaults.JmxProperties;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    29
import java.io.IOException;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
import java.util.ArrayList;
900
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
    31
import java.util.Arrays;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
import java.util.Collection;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
import java.util.Collections;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
import java.util.Comparator;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
import java.util.HashMap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
import java.util.HashSet;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
import java.util.IdentityHashMap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
import java.util.LinkedHashMap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
import java.util.List;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
import java.util.Map;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
import java.util.Set;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
import java.util.SortedMap;
1004
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
    43
import java.util.SortedSet;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
import java.util.TreeMap;
1004
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
    45
import java.util.TreeSet;
833
bfa2bef7517c 6323980: Annotations to simplify MBean development
emcmanus
parents: 287
diff changeset
    46
import java.util.WeakHashMap;
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    47
import java.util.logging.Level;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    48
import javax.management.MBeanServer;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    49
import javax.management.MBeanServerDelegate;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    50
import javax.management.MBeanServerFactory;
287
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents: 2
diff changeset
    51
import javax.management.MalformedObjectNameException;
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    52
import javax.management.ObjectInstance;
287
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents: 2
diff changeset
    53
import javax.management.ObjectName;
1004
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
    54
import javax.management.loading.ClassLoaderRepository;
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    55
import static javax.management.namespace.JMXNamespaces.NAMESPACE_SEPARATOR;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
public class Util {
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    58
    private final static int NAMESPACE_SEPARATOR_LENGTH =
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    59
            NAMESPACE_SEPARATOR.length();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    60
    public final static String ILLEGAL_MBEANSERVER_NAME_CHARS=";:*?";
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    61
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
    62
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
    static <K, V> Map<K, V> newMap() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
        return new HashMap<K, V>();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
    static <K, V> Map<K, V> newSynchronizedMap() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
        return Collections.synchronizedMap(Util.<K, V>newMap());
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
    static <K, V> IdentityHashMap<K, V> newIdentityHashMap() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
        return new IdentityHashMap<K, V>();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
    static <K, V> Map<K, V> newSynchronizedIdentityHashMap() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
        Map<K, V> map = newIdentityHashMap();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
        return Collections.synchronizedMap(map);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
    static <K, V> SortedMap<K, V> newSortedMap() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
        return new TreeMap<K, V>();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
    static <K, V> SortedMap<K, V> newSortedMap(Comparator<? super K> comp) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
        return new TreeMap<K, V>(comp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
    static <K, V> Map<K, V> newInsertionOrderMap() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
        return new LinkedHashMap<K, V>();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
833
bfa2bef7517c 6323980: Annotations to simplify MBean development
emcmanus
parents: 287
diff changeset
    92
    static <K, V> WeakHashMap<K, V> newWeakHashMap() {
bfa2bef7517c 6323980: Annotations to simplify MBean development
emcmanus
parents: 287
diff changeset
    93
        return new WeakHashMap<K, V>();
bfa2bef7517c 6323980: Annotations to simplify MBean development
emcmanus
parents: 287
diff changeset
    94
    }
bfa2bef7517c 6323980: Annotations to simplify MBean development
emcmanus
parents: 287
diff changeset
    95
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
    static <E> Set<E> newSet() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
        return new HashSet<E>();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
    static <E> Set<E> newSet(Collection<E> c) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
        return new HashSet<E>(c);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
    static <E> List<E> newList() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
        return new ArrayList<E>();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
    static <E> List<E> newList(Collection<E> c) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
        return new ArrayList<E>(c);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
287
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents: 2
diff changeset
   112
    public static ObjectName newObjectName(String s) {
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents: 2
diff changeset
   113
        try {
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents: 2
diff changeset
   114
            return new ObjectName(s);
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents: 2
diff changeset
   115
        } catch (MalformedObjectNameException e) {
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents: 2
diff changeset
   116
            throw new IllegalArgumentException(e);
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents: 2
diff changeset
   117
        }
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents: 2
diff changeset
   118
    }
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents: 2
diff changeset
   119
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
    /* This method can be used by code that is deliberately violating the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
     * allowed checked casts.  Rather than marking the whole method containing
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
     * the code with @SuppressWarnings, you can use a call to this method for
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
     * the exact place where you need to escape the constraints.  Typically
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
     * you will "import static" this method and then write either
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
     *    X x = cast(y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
     * or, if that doesn't work (e.g. X is a type variable)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
     *    Util.<X>cast(y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
    @SuppressWarnings("unchecked")
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
    public static <T> T cast(Object x) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
        return (T) x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
    }
900
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   133
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   134
    /**
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   135
     * Computes a descriptor hashcode from its names and values.
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   136
     * @param names  the sorted array of descriptor names.
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   137
     * @param values the array of descriptor values.
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   138
     * @return a hash code value, as described in {@link #hashCode(Descriptor)}
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   139
     */
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   140
    public static int hashCode(String[] names, Object[] values) {
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   141
        int hash = 0;
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   142
        for (int i = 0; i < names.length; i++) {
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   143
            Object v = values[i];
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   144
            int h;
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   145
            if (v == null) {
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   146
                h = 0;
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   147
            } else if (v instanceof Object[]) {
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   148
                h = Arrays.deepHashCode((Object[]) v);
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   149
            } else if (v.getClass().isArray()) {
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   150
                h = Arrays.deepHashCode(new Object[]{v}) - 31;
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   151
            // hashcode of a list containing just v is
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   152
            // v.hashCode() + 31, see List.hashCode()
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   153
            } else {
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   154
                h = v.hashCode();
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   155
            }
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   156
            hash += names[i].toLowerCase().hashCode() ^ h;
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   157
        }
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   158
        return hash;
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   159
    }
55c9c5a88bde 6402254: Revisit ModelMBean DescriptorSupport implementation of equals and hashCode.
dfuchs
parents: 834
diff changeset
   160
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   161
    /** Match a part of a string against a shell-style pattern.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   162
        The only pattern characters recognized are <code>?</code>,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   163
        standing for any one character,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   164
        and <code>*</code>, standing for any string of
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   165
        characters, including the empty string. For instance,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   166
        {@code wildmatch("sandwich","sa?d*ch",1,4,1,4)} will match
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   167
        {@code "and"} against {@code "a?d"}.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   168
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   169
        @param str  the string containing the sequence to match.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   170
        @param pat  a string containing a pattern to match the sub string
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   171
                    against.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   172
        @param stri   the index in the string at which matching should begin.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   173
        @param strend the index in the string at which the matching should
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   174
                      end.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   175
        @param pati   the index in the pattern at which matching should begin.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   176
        @param patend the index in the pattern at which the matching should
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   177
                      end.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   178
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   179
        @return true if and only if the string matches the pattern.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   180
    */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   181
    /* The algorithm is a classical one.  We advance pointers in
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   182
       parallel through str and pat.  If we encounter a star in pat,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   183
       we remember its position and continue advancing.  If at any
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   184
       stage we get a mismatch between str and pat, we look to see if
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   185
       there is a remembered star.  If not, we fail.  If so, we
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   186
       retreat pat to just past that star and str to the position
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   187
       after the last one we tried, and we let the match advance
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   188
       again.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   189
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   190
       Even though there is only one remembered star position, the
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   191
       algorithm works when there are several stars in the pattern.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   192
       When we encounter the second star, we forget the first one.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   193
       This is OK, because if we get to the second star in A*B*C
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   194
       (where A etc are arbitrary strings), we have already seen AXB.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   195
       We're therefore setting up a match of *C against the remainder
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   196
       of the string, which will match if that remainder looks like
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   197
       YC, so the whole string looks like AXBYC.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   198
    */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   199
    private static boolean wildmatch(final String str, final String pat,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   200
            int stri, final int strend, int pati, final int patend) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   201
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   202
        // System.out.println("matching "+pat.substring(pati,patend)+
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   203
        //        " against "+str.substring(stri, strend));
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   204
        int starstri; // index for backtrack if "*" attempt fails
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   205
        int starpati; // index for backtrack if "*" attempt fails, +1
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   206
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   207
        starstri = starpati = -1;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   208
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   209
        /* On each pass through this loop, we either advance pati,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   210
           or we backtrack pati and advance starstri.  Since starstri
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   211
           is only ever assigned from pati, the loop must terminate.  */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   212
        while (true) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   213
            if (pati < patend) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   214
                final char patc = pat.charAt(pati);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   215
                switch (patc) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   216
                case '?':
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   217
                    if (stri == strend)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   218
                        break;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   219
                    stri++;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   220
                    pati++;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   221
                    continue;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   222
                case '*':
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   223
                    pati++;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   224
                    starpati = pati;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   225
                    starstri = stri;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   226
                    continue;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   227
                default:
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   228
                    if (stri < strend && str.charAt(stri) == patc) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   229
                        stri++;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   230
                        pati++;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   231
                        continue;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   232
                    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   233
                    break;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   234
                }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   235
            } else if (stri == strend)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   236
                return true;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   237
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   238
            // Mismatched, can we backtrack to a "*"?
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   239
            if (starpati < 0 || starstri == strend)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   240
                return false;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   241
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   242
            // Retry the match one position later in str
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   243
            pati = starpati;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   244
            starstri++;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   245
            stri = starstri;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   246
        }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   247
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   248
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   249
    /** Match a string against a shell-style pattern.  The only pattern
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   250
        characters recognized are <code>?</code>, standing for any one
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   251
        character, and <code>*</code>, standing for any string of
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   252
        characters, including the empty string.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   253
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   254
        @param str the string to match.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   255
        @param pat the pattern to match the string against.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   256
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   257
        @return true if and only if the string matches the pattern.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   258
    */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   259
    public static boolean wildmatch(String str, String pat) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   260
        return wildmatch(str,pat,0,str.length(),0,pat.length());
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   261
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   262
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   263
    /**
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   264
     * Matches a string against a pattern, as a name space path.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   265
     * This is a special matching where * and ?? don't match //.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   266
     * The string is split in sub-strings separated by //, and the
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   267
     * pattern is split in sub-patterns separated by //. Each sub-string
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   268
     * is matched against its corresponding sub-pattern.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   269
     * so <elt-1>//<elt2>//...//<elt-n> matches <pat-1>//<pat-2>//...//<pat-q>
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   270
     * only if n==q and for ( i = 1 => n) elt-i matches pat-i.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   271
     *
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   272
     * In addition, if we encounter a pattern element which is exactly
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   273
     * **, it can match any number of path-elements - but it must match at
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   274
     * least one element.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   275
     * When we encounter such a meta-wildcard, we remember its position
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   276
     * and the position in the string path, and we advance both the pattern
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   277
     * and the string. Later, if we encounter a mismatch in pattern & string,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   278
     * we rewind the position in pattern to just after the meta-wildcard,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   279
     * and we backtrack the string to i+1 element after the position
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   280
     * we had when we first encountered the meta-wildcard, i being the
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   281
     * position when we last backtracked the string.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   282
     *
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   283
     * The backtracking logic is an adaptation of the logic in wildmatch
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   284
     * above.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   285
     * See test/javax/mangement/ObjectName/ApplyWildcardTest.java
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   286
     *
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   287
     * Note: this thing is called 'wild' - and that's for a reason ;-)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   288
     **/
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   289
    public static boolean wildpathmatch(String str, String pat) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   290
        final int strlen = str.length();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   291
        final int patlen = pat.length();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   292
        int stri = 0;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   293
        int pati = 0;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   294
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   295
        int starstri; // index for backtrack if "**" attempt fails
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   296
        int starpati; // index for backtrack if "**" attempt fails
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   297
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   298
        starstri = starpati = -1;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   299
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   300
        while (true) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   301
            // System.out.println("pati="+pati+", stri="+stri);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   302
            final int strend = str.indexOf(NAMESPACE_SEPARATOR, stri);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   303
            final int patend = pat.indexOf(NAMESPACE_SEPARATOR, pati);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   304
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   305
            // no // remaining in either string or pattern: simple wildmatch
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   306
            // until end of string.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   307
            if (strend == -1 && patend == -1) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   308
                // System.out.println("last sub pattern, last sub element...");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   309
                // System.out.println("wildmatch("+str.substring(stri,strlen)+
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   310
                //    ","+pat.substring(pati,patlen)+")");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   311
                return wildmatch(str,pat,stri,strlen,pati,patlen);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   312
            }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   313
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   314
            // no // remaining in string, but at least one remaining in
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   315
            // pattern
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   316
            // => no match
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   317
            if (strend == -1) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   318
                // System.out.println("pattern has more // than string...");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   319
                return false;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   320
            }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   321
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   322
            // strend is != -1, but patend might.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   323
            // detect wildcard **
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   324
            if (patend == pati+2 && pat.charAt(pati)=='*' &&
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   325
                    pat.charAt(pati+1)=='*') {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   326
                // if we reach here we know that neither strend nor patend are
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   327
                // equals to -1.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   328
                stri     = strend + NAMESPACE_SEPARATOR_LENGTH;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   329
                pati     = patend + NAMESPACE_SEPARATOR_LENGTH;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   330
                starpati = pati; // position just after **// in pattern
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   331
                starstri = stri; // we eat 1 element in string, and remember
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   332
                                 // the position for backtracking and eating
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   333
                                 // one more element if needed.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   334
                // System.out.println("starpati="+pati);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   335
                continue;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   336
            }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   337
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   338
            // This is a bit hacky: * can match // when // is at the end
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   339
            // of the string, so we include the // delimiter in the pattern
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   340
            // matching. Either we're in the middle of the path, so including
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   341
            // // both at the end of the pattern and at the end of the string
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   342
            // has no effect - match(*//,dfsd//) is equivalent to match(*,dfsd)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   343
            // or we're at the end of the pattern path, in which case
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   344
            // including // at the end of the string will have the desired
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   345
            // effect (provided that we detect the end of matching correctly,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   346
            // see further on).
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   347
            //
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   348
            final int endpat =
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   349
                    ((patend > -1)?patend+NAMESPACE_SEPARATOR_LENGTH:patlen);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   350
            final int endstr =
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   351
                    ((strend > -1)?strend+NAMESPACE_SEPARATOR_LENGTH:strlen);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   352
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   353
            // if we reach the end of the pattern, or if elt-i & pat-i
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   354
            // don't match, we have a mismatch.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   355
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   356
            // Note: we know that strend != -1, therefore patend==-1
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   357
            //       indicates a mismatch unless pattern can match
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   358
            //       a // at the end, and strend+2=strlen.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   359
            // System.out.println("wildmatch("+str.substring(stri,endstr)+","+
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   360
            //        pat.substring(pati,endpat)+")");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   361
            if (!wildmatch(str,pat,stri,endstr,pati,endpat)) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   362
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   363
                // System.out.println("nomatch");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   364
                // if we have a mismatch and didn't encounter any meta-wildcard,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   365
                // we return false. String & pattern don't match.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   366
                if (starpati < 0) return false;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   367
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   368
                // If we reach here, we had a meta-wildcard.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   369
                // We need to backtrack to the wildcard, and make it eat an
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   370
                // additional string element.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   371
                //
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   372
                stri = str.indexOf(NAMESPACE_SEPARATOR, starstri);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   373
                // System.out.println("eating one additional element? "+stri);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   374
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   375
                // If there's no more elements to eat, string and pattern
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   376
                // don't match => return false.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   377
                if (stri == -1) return false;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   378
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   379
                // Backtrack to where we were when we last matched against
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   380
                // the meta-wildcard, make it eat an additional path element,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   381
                // remember the new positions, and continue from there...
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   382
                //
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   383
                stri = stri + NAMESPACE_SEPARATOR_LENGTH;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   384
                starstri = stri;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   385
                pati = starpati;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   386
                // System.out.println("skiping to stri="+stri);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   387
                continue;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   388
            }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   389
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   390
            // Here we know that strend > -1 but we can have patend == -1.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   391
            //
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   392
            // So if we reach here, we know pat-i+//? has matched
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   393
            // elt-i+//
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   394
            //
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   395
            // If patend==-1, we know that there was no delimiter
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   396
            // at the end of the pattern, that we are at the last pattern,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   397
            // and therefore that pat-i has matched elt-i+//
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   398
            //
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   399
            // In that case we can consider that we have a match only if
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   400
            // elt-i is also the last path element in the string, which is
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   401
            // equivalent to saying that strend+2==strlen.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   402
            //
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   403
            if (patend == -1 && starpati == -1)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   404
                return (strend+NAMESPACE_SEPARATOR_LENGTH==strlen);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   405
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   406
            // patend != -1, or starpati > -1 so there remains something
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   407
            // to match.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   408
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   409
            // go to next pair: elt-(i+1) pat-(i+1);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   410
            stri = strend + NAMESPACE_SEPARATOR_LENGTH;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   411
            pati = (patend==-1)?pati:(patend + NAMESPACE_SEPARATOR_LENGTH);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   412
        }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   413
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   414
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   415
    /**
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   416
     * Returns true if the ObjectName's {@code domain} is selected by the
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   417
     * given {@code pattern}.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   418
     */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   419
    public static boolean isDomainSelected(String domain, String pattern) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   420
        if  (domain == null || pattern == null)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   421
            throw new IllegalArgumentException("null");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   422
        return Util.wildpathmatch(domain,pattern);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   423
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   424
1004
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   425
    /**
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   426
     * Filters a set of ObjectName according to a given pattern.
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   427
     *
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   428
     * @param pattern the pattern that the returned names must match.
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   429
     * @param all     the set of names to filter.
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   430
     * @return a set of ObjectName from which non matching names
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   431
     *         have been removed.
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   432
     */
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   433
    public static Set<ObjectName> filterMatchingNames(ObjectName pattern,
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   434
                                        Set<ObjectName> all) {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   435
        // If no pattern, just return all names
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   436
        if (pattern == null
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   437
                || all.isEmpty()
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   438
                || ObjectName.WILDCARD.equals(pattern))
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   439
            return all;
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   440
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   441
        // If there's a pattern, do the matching.
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   442
        final Set<ObjectName> res = equivalentEmptySet(all);
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   443
        for (ObjectName n : all) if (pattern.apply(n)) res.add(n);
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   444
        return res;
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   445
    }
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   446
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   447
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   448
    /**
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   449
     * Filters a set of ObjectInstance according to a given pattern.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   450
     *
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   451
     * @param pattern the pattern that the returned names must match.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   452
     * @param all     the set of instances to filter.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   453
     * @return a set of ObjectInstance from which non matching instances
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   454
     *         have been removed.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   455
     */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   456
    public static Set<ObjectInstance>
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   457
            filterMatchingInstances(ObjectName pattern,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   458
                                        Set<ObjectInstance> all) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   459
        // If no pattern, just return all names
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   460
        if (pattern == null
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   461
                || all.isEmpty()
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   462
                || ObjectName.WILDCARD.equals(pattern))
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   463
            return all;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   464
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   465
        // If there's a pattern, do the matching.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   466
        final Set<ObjectInstance> res = equivalentEmptySet(all);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   467
        for (ObjectInstance n : all) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   468
            if (n == null) continue;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   469
            if (pattern.apply(n.getObjectName()))
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   470
                res.add(n);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   471
        }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   472
        return res;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   473
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   474
1004
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   475
    /**
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   476
     * An abstract ClassLoaderRepository that contains a single class loader.
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   477
     **/
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   478
    private final static class SingleClassLoaderRepository
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   479
            implements ClassLoaderRepository {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   480
        private final ClassLoader singleLoader;
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   481
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   482
        SingleClassLoaderRepository(ClassLoader loader) {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   483
            this.singleLoader = loader;
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   484
        }
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   485
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   486
        ClassLoader getSingleClassLoader() {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   487
           return singleLoader;
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   488
        }
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   489
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   490
        private Class<?> loadClass(String className, ClassLoader loader)
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   491
                throws ClassNotFoundException {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   492
            return Class.forName(className, false, loader);
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   493
        }
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   494
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   495
        public Class<?> loadClass(String className)
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   496
                throws ClassNotFoundException {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   497
            return loadClass(className, getSingleClassLoader());
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   498
        }
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   499
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   500
        public Class<?> loadClassWithout(ClassLoader exclude,
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   501
                String className) throws ClassNotFoundException {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   502
            final ClassLoader loader = getSingleClassLoader();
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   503
            if (exclude != null && exclude.equals(loader))
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   504
                throw new ClassNotFoundException(className);
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   505
            return loadClass(className, loader);
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   506
        }
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   507
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   508
        public Class<?> loadClassBefore(ClassLoader stop, String className)
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   509
                throws ClassNotFoundException {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   510
            return loadClassWithout(stop, className);
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   511
        }
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   512
    }
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   513
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   514
    /**
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   515
     * Returns a ClassLoaderRepository that contains a single class loader.
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   516
     * @param loader the class loader contained in the returned repository.
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   517
     * @return a ClassLoaderRepository that contains the single loader.
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   518
     */
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   519
    public static ClassLoaderRepository getSingleClassLoaderRepository(
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   520
            final ClassLoader loader) {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   521
        return new SingleClassLoaderRepository(loader);
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   522
    }
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   523
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   524
    /**
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   525
     * Returns the name of the given MBeanServer that should be put in a
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   526
     * permission you need.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   527
     * This corresponds to the
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   528
     * {@code *[;mbeanServerName=<mbeanServerName>[;*]]} property
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   529
     * embedded in the MBeanServerId attribute of the
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   530
     * server's {@link MBeanServerDelegate}.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   531
     *
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   532
     * @param server The MBean server
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   533
     * @return the name of the MBeanServer, or "*" if the name couldn't be
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   534
     *         obtained, or {@value MBeanServerFactory#DEFAULT_MBEANSERVER_NAME}
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   535
     *         if there was no name.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   536
     */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   537
    public static String getMBeanServerSecurityName(MBeanServer server) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   538
        final String notfound = "*";
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   539
        try {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   540
            final String mbeanServerId = (String)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   541
                    server.getAttribute(MBeanServerDelegate.DELEGATE_NAME,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   542
                    "MBeanServerId");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   543
            final String found = extractMBeanServerName(mbeanServerId);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   544
            if (found.length()==0)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   545
                return MBeanServerFactory.DEFAULT_MBEANSERVER_NAME;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   546
            return found;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   547
        } catch (Exception x) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   548
            logshort("Failed to retrieve MBeanServerName for server, " +
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   549
                    "using \"*\"",x);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   550
            return notfound;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   551
        }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   552
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   553
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   554
    /**
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   555
     * Returns the name of the MBeanServer embedded in the given
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   556
     * mbeanServerId. If the given mbeanServerId doesn't contain any name,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   557
     * an empty String is returned.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   558
     * The MBeanServerId is expected to be of the form:
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   559
     * {@code *[;mbeanServerName=<mbeanServerName>[;*]]}
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   560
     * @param mbeanServerId The MBean server ID
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   561
     * @return the name of the MBeanServer if found, or "" if the name was
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   562
     *         not present in the mbeanServerId.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   563
     */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   564
    public static String extractMBeanServerName(String mbeanServerId) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   565
        if (mbeanServerId==null) return "";
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   566
        final String beginMarker=";mbeanServerName=";
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   567
        final String endMarker=";";
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   568
        final int found = mbeanServerId.indexOf(beginMarker);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   569
        if (found < 0) return "";
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   570
        final int start = found + beginMarker.length();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   571
        final int stop = mbeanServerId.indexOf(endMarker, start);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   572
        return mbeanServerId.substring(start,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   573
                (stop < 0 ? mbeanServerId.length() : stop));
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   574
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   575
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   576
    /**
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   577
     * Insert the given mbeanServerName into the given mbeanServerId.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   578
     * If mbeanServerName is null, empty, or equals to "-", the returned
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   579
     * mbeanServerId will not contain any mbeanServerName.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   580
     * @param mbeanServerId    The mbeanServerId in which to insert
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   581
     *                         mbeanServerName
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   582
     * @param mbeanServerName  The mbeanServerName
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   583
     * @return an mbeanServerId containing the given mbeanServerName
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   584
     * @throws IllegalArgumentException if mbeanServerId already contains
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   585
     *         a different name, or if the given mbeanServerName is not valid.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   586
     */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   587
    public static String insertMBeanServerName(String mbeanServerId,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   588
            String mbeanServerName) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   589
        final String found = extractMBeanServerName(mbeanServerId);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   590
        if (found.length() > 0 &&
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   591
                found.equals(checkServerName(mbeanServerName)))
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   592
            return mbeanServerId;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   593
        if (found.length() > 0 && !isMBeanServerNameUndefined(found))
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   594
            throw new IllegalArgumentException(
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   595
                    "MBeanServerName already defined");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   596
        if (isMBeanServerNameUndefined(mbeanServerName))
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   597
            return mbeanServerId;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   598
        final String beginMarker=";mbeanServerName=";
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   599
        return mbeanServerId+beginMarker+checkServerName(mbeanServerName);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   600
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   601
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   602
    /**
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   603
     * Returns true if the given mbeanServerName corresponds to an
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   604
     * undefined MBeanServerName.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   605
     * The mbeanServerName is considered undefined if it is one of:
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   606
     * {@code null} or {@value MBeanServerFactory#DEFAULT_MBEANSERVER_NAME}.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   607
     * @param mbeanServerName The mbeanServerName, as returned by
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   608
     *        {@link #extractMBeanServerName(String)}.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   609
     * @return true if the given name corresponds to one of the forms that
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   610
     *         denotes an undefined MBeanServerName.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   611
     */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   612
    public static boolean isMBeanServerNameUndefined(String mbeanServerName) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   613
        return mbeanServerName == null ||
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   614
           MBeanServerFactory.DEFAULT_MBEANSERVER_NAME.equals(mbeanServerName);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   615
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   616
    /**
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   617
     * Check that the provided mbeanServername is syntactically valid.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   618
     * @param mbeanServerName An mbeanServerName, or {@code null}.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   619
     * @return mbeanServerName, or {@value
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   620
     * MBeanServerFactory#DEFAULT_MBEANSERVER_NAME} if {@code mbeanServerName}
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   621
     * is {@code null}.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   622
     * @throws IllegalArgumentException if mbeanServerName contains illegal
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   623
     *         characters, or is empty, or is {@code "-"}.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   624
     *         Illegal characters are {@value #ILLEGAL_MBEANSERVER_NAME_CHARS}.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   625
     */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   626
    public static String checkServerName(String mbeanServerName) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   627
        if ("".equals(mbeanServerName))
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   628
            throw new IllegalArgumentException(
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   629
                    "\"\" is not a valid MBean server name");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   630
        if ("-".equals(mbeanServerName))
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   631
            throw new IllegalArgumentException(
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   632
                    "\"-\" is not a valid MBean server name");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   633
        if (isMBeanServerNameUndefined(mbeanServerName))
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   634
            return MBeanServerFactory.DEFAULT_MBEANSERVER_NAME;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   635
        for (char c : ILLEGAL_MBEANSERVER_NAME_CHARS.toCharArray()) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   636
            if (mbeanServerName.indexOf(c) >= 0)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   637
                throw new IllegalArgumentException(
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   638
                        "invalid character in MBeanServer name: "+c);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   639
        }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   640
        return mbeanServerName;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   641
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   642
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   643
    /**
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   644
     * Get the MBeanServer name that should be put in a permission you need.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   645
     *
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   646
     * @param delegate The MBeanServerDelegate
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   647
     * @return The MBeanServer name - or {@value
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   648
     * MBeanServerFactory#DEFAULT_MBEANSERVER_NAME} if there was no name.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   649
     */
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   650
    public static String getMBeanServerSecurityName(
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   651
            MBeanServerDelegate delegate) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   652
        try {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   653
            final String serverName = delegate.getMBeanServerName();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   654
            if (isMBeanServerNameUndefined(serverName))
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   655
                return MBeanServerFactory.DEFAULT_MBEANSERVER_NAME;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   656
            return serverName;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   657
        } catch (Exception x) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   658
            logshort("Failed to retrieve MBeanServerName from delegate, " +
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   659
                    "using \"*\"",x);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   660
            return "*";
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   661
        }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   662
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   663
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   664
    // Log the exception and its causes without logging the stack trace.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   665
    // Use with care - it is usally preferable to log the whole stack trace!
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   666
    // We don't want to log the whole stack trace here: logshort() is
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   667
    // called in those cases where the exception might not be abnormal.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   668
    private static void logshort(String msg, Throwable t) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   669
        if (JmxProperties.MISC_LOGGER.isLoggable(Level.FINE)) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   670
            StringBuilder toprint = new StringBuilder(msg);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   671
               toprint.append("\nCaused By: ").append(String.valueOf(t));
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   672
            while ((t=t.getCause())!=null)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   673
               toprint.append("\nCaused By: ").append(String.valueOf(t));
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   674
            JmxProperties.MISC_LOGGER.fine(toprint.toString());
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   675
       }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   676
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   677
1004
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   678
    public static <T> Set<T> cloneSet(Set<T> set) {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   679
        if (set instanceof SortedSet) {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   680
            @SuppressWarnings("unchecked")
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   681
            SortedSet<T> sset = (SortedSet<T>) set;
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   682
            set = new TreeSet<T>(sset.comparator());
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   683
            set.addAll(sset);
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   684
        } else
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   685
            set = new HashSet<T>(set);
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   686
        return set;
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   687
    }
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   688
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   689
    public static <T> Set<T> equivalentEmptySet(Set<T> set) {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   690
        if (set instanceof SortedSet) {
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   691
            @SuppressWarnings("unchecked")
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   692
            SortedSet<T> sset = (SortedSet<T>) set;
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   693
            set = new TreeSet<T>(sset.comparator());
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   694
        } else
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   695
            set = new HashSet<T>();
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   696
        return set;
5ba8217eb504 5108776: Add reliable event handling to the JMX API
sjiang
parents: 900
diff changeset
   697
    }
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   698
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   699
    // This exception is used when wrapping a class that throws IOException
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   700
    // in a class that doesn't.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   701
    // The typical example for this are JMXNamespaces, when the sub
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   702
    // MBeanServer can be remote.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   703
    //
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   704
    public static RuntimeException newRuntimeIOException(IOException io) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   705
        final String msg = "Communication failed with underlying resource: "+
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   706
                io.getMessage();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   707
        return new RuntimeException(msg,io);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1004
diff changeset
   708
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
}