jdk/src/share/classes/javax/management/ObjectName.java
author dfuchs
Tue, 09 Dec 2008 20:20:48 +0100
changeset 1709 392dd6db361a
parent 1225 6ef6227d36eb
child 4156 acaa49a2768a
permissions -rw-r--r--
6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces 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: 686
diff changeset
     2
 * Copyright 1999-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 javax.management;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
import com.sun.jmx.mbeanserver.GetPropertyAction;
287
bff5501b2a02 6610917: Define a generic NotificationFilter
emcmanus
parents: 34
diff changeset
    29
import com.sun.jmx.mbeanserver.Util;
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
    30
import com.sun.jmx.namespace.serial.JMXNamespaceContext;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
    31
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
import java.io.IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
import java.io.InvalidObjectException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
import java.io.ObjectInputStream;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
import java.io.ObjectOutputStream;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
import java.io.ObjectStreamField;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
import java.security.AccessController;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
import java.util.Arrays;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
import java.util.Collections;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
import java.util.HashMap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
import java.util.Hashtable;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
import java.util.Map;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
/**
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
 * <p>Represents the object name of an MBean, or a pattern that can
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
 * match the names of several MBeans.  Instances of this class are
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
 * immutable.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
 * <p>An instance of this class can be used to represent:</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
 * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
 * <li>An object name</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
 * <li>An object name pattern, within the context of a query</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
 * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
 * <p>An object name consists of two parts, the domain and the key
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
 * properties.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
 * <p>The <em>domain</em> is a string of characters not including
1709
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    59
 * the character colon (<code>:</code>).</p>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    60
 * <p>Starting with the version 2.0 of the JMX specification, the
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    61
 * <em>domain</em> can also start with a {@linkplain
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    62
 * javax.management.namespace#NamespacePrefix namespace prefix} identifying
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    63
 * the {@linkplain javax.management.namespace namespace} in which the
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    64
 * MBean is registered. A namespace prefix is a path string where
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    65
 * elements are separated by a double slash (<code>//</code>).
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    66
 * It identifies the {@linkplain  javax.management.namespace namespace} in
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    67
 * which the MBean so named is registered.</p>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    68
 *
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    69
 * <p>For instance the ObjectName <em>bar//baz:k=v</em> identifiies an MBean
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    70
 * named <em>baz:k=v</em> in the namespace <em>bar</em>. Similarly the
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    71
 * ObjectName <em>foo//bar//baz:k=v</em> identifiies an MBean named
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    72
 * <em>baz:k=v</em> in the namespace <em>foo//bar</em>. See the {@linkplain
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    73
 * javax.management.namespace namespace} documentation for more details.</p>
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
 * <p>If the domain includes at least one occurrence of the wildcard
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
 * characters asterisk (<code>*</code>) or question mark
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
 * (<code>?</code>), then the object name is a pattern.  The asterisk
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
 * matches any sequence of zero or more characters, while the question
1709
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    79
 * mark matches any single character. <br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    80
 * A namespace separator <code>//</code> does not match wildcard
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    81
 * characters unless it is at the very end of the domain string.
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    82
 * So <em>foo*bar*:*</em> does not match <em>foo//bar:k=v</em> but it
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    83
 * does match <em>fooxbar//:k=v</em>.
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    84
 * </p>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    85
 *
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    86
 * <p>When included in a namespace path the special path element
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    87
 * <code>**</code> matches any number of sub namespaces
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    88
 * recursively, but only if used as a complete namespace path element,
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    89
 * as in <code>*&#42;//b//c//D:k=v</code> or <code>a//*&#42;//c//D:k=v</code>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
    90
 * - see <a href="#metawildcard">below</a>.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
 * <p>If the domain is empty, it will be replaced in certain contexts
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
 * by the <em>default domain</em> of the MBean server in which the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
 * ObjectName is used.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
 * <p>The <em>key properties</em> are an unordered set of keys and
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
 * associated values.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
 * <p>Each <em>key</em> is a nonempty string of characters which may
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
 * not contain any of the characters comma (<code>,</code>), equals
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
 * (<code>=</code>), colon, asterisk, or question mark.  The same key
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
 * may not occur twice in a given ObjectName.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
 * <p>Each <em>value</em> associated with a key is a string of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
 * characters that is either unquoted or quoted.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
 * <p>An <em>unquoted value</em> is a possibly empty string of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
 * characters which may not contain any of the characters comma,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
 * equals, colon, or quote.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
 * <p>If the <em>unquoted value</em> contains at least one occurrence
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
 * of the wildcard characters asterisk or question mark, then the object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
 * name is a <em>property value pattern</em>. The asterisk matches any
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
 * sequence of zero or more characters, while the question mark matches
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
 * any single character.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
 * <p>A <em>quoted value</em> consists of a quote (<code>"</code>),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
 * followed by a possibly empty string of characters, followed by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
 * another quote.  Within the string of characters, the backslash
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
 * (<code>\</code>) has a special meaning.  It must be followed by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
 * one of the following characters:</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
 * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
 * <li>Another backslash.  The second backslash has no special
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
 * meaning and the two characters represent a single backslash.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
 * <li>The character 'n'.  The two characters represent a newline
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
 * ('\n' in Java).</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
 * <li>A quote.  The two characters represent a quote, and that quote
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
 * is not considered to terminate the quoted value. An ending closing
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
 * quote must be present for the quoted value to be valid.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
 * <li>A question mark (?) or asterisk (*).  The two characters represent
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
 * a question mark or asterisk respectively.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
 * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
 * <p>A quote may not appear inside a quoted value except immediately
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
 * after an odd number of consecutive backslashes.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
 * <p>The quotes surrounding a quoted value, and any backslashes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
 * within that value, are considered to be part of the value.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
 * <p>If the <em>quoted value</em> contains at least one occurrence of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
 * the characters asterisk or question mark and they are not preceded
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
 * by a backslash, then they are considered as wildcard characters and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
 * the object name is a <em>property value pattern</em>. The asterisk
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
 * matches any sequence of zero or more characters, while the question
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
 * mark matches any single character.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
 * <p>An ObjectName may be a <em>property list pattern</em>. In this
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
 * case it may have zero or more keys and associated values. It matches
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
 * a nonpattern ObjectName whose domain matches and that contains the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
 * same keys and associated values, as well as possibly other keys and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
 * values.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
 * <p>An ObjectName is a <em>property value pattern</em> when at least
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
 * one of its <em>quoted</em> or <em>unquoted</em> key property values
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
 * contains the wildcard characters asterisk or question mark as described
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
 * above. In this case it has one or more keys and associated values, with
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
 * at least one of the values containing wildcard characters. It matches a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
 * nonpattern ObjectName whose domain matches and that contains the same
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
 * keys whose values match; if the property value pattern is also a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
 * property list pattern then the nonpattern ObjectName can contain
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
 * other keys and values.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
 * <p>An ObjectName is a <em>property pattern</em> if it is either a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
 * <em>property list pattern</em> or a <em>property value pattern</em>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
 * or both.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
 * <p>An ObjectName is a pattern if its domain contains a wildcard or
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
 * if the ObjectName is a property pattern.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
 * <p>If an ObjectName is not a pattern, it must contain at least one
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
 * key with its associated value.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
 * <p>Examples of ObjectName patterns are:</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
 * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
 * <li>{@code *:type=Foo,name=Bar} to match names in any domain whose
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
 *     exact set of keys is {@code type=Foo,name=Bar}.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
 * <li>{@code d:type=Foo,name=Bar,*} to match names in the domain
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
 *     {@code d} that have the keys {@code type=Foo,name=Bar} plus
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
 *     zero or more other keys.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
 * <li>{@code *:type=Foo,name=Bar,*} to match names in any domain
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
 *     that has the keys {@code type=Foo,name=Bar} plus zero or
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
 *     more other keys.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
 * <li>{@code d:type=F?o,name=Bar} will match e.g.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
 *     {@code d:type=Foo,name=Bar} and {@code d:type=Fro,name=Bar}.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
 * <li>{@code d:type=F*o,name=Bar} will match e.g.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
 *     {@code d:type=Fo,name=Bar} and {@code d:type=Frodo,name=Bar}.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
 * <li>{@code d:type=Foo,name="B*"} will match e.g.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
 *     {@code d:type=Foo,name="Bling"}. Wildcards are recognized even
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
 *     inside quotes, and like other special characters can be escaped
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
 *     with {@code \}.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
 * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
 *
1709
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   198
 * <p id="metawildcard"><b>Pattern and namespaces:</b></p>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   199
 * <p>In an object name pattern, a path element
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   200
 *    of exactly <code>**</code> corresponds to a meta
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   201
 *    wildcard that will match any number of sub namespaces.<br>Hence:</p>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   202
 * <table border="0" cellpadding="5">
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   203
 * <thead><th>pattern</th><th>matches</th><th>doesn't match</th></thead>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   204
 * <tbody>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   205
 * <tr><td><ul><li><code>*&#42;//D:k=v</code></li></ul></td>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   206
 *     <td><code>a//D:k=v</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   207
 *         <code>a//b//D:k=v</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   208
 *         <code>a//b//c//D:k=v</code></td>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   209
 *     <td><code>D:k=v</code></td></tr>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   210
 * <tr><td><ul><li><code>a//*&#42;//D:k=v</code></li></ul></td>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   211
 *     <td><code>a//b//D:k=v</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   212
 *         <code>a//b//c//D:k=v</code></td>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   213
 *     <td><code>b//b//c//D:k=v</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   214
 *         <code>a//D:k=v</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   215
 *         <code>D:k=v</code></td></tr>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   216
 * <tr><td><ul><li><code>a//*&#42;//e//D:k=v</code></li></ul></td>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   217
 *     <td><code>a//b//e//D:k=v</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   218
 *         <code>a//b//c//e//D:k=v</code></td>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   219
 *     <td><code>a//b//c//c//D:k=v</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   220
 *         <code>b//b//c//e//D:k=v</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   221
 *         <code>a//e//D:k=v</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   222
 *         <code>e//D:k=v</code></td></tr>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   223
 * <tr><td><ul><li><code>a//b*&#42;//e//D:k=v</code></li></ul></td>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   224
 *      <td><code>a//b//e//D:k=v</code></td>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   225
 *      <td><code>a//b//c//e//D:k=v</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   226
 *          because in that case <code>b*&#42;</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   227
 *         is not a meta-wildcard - and <code>b**</code><br>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   228
 *         is thus equivalent to <code>b*</code>.</td></tr>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   229
 * </tbody>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   230
 * </table>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   231
 *</ul>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   232
 * </p>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   233
 * <p>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   234
 * <b>Note:</b> Although ObjectName patterns where the characters
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   235
 * <code>*</code> and <code>?</code> appear in the namespace path are legal,
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   236
 * they are not valid in the {@code name} parameter of the MBean Server's
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   237
 * {@link MBeanServer#queryNames queryNames} and {@link MBeanServer#queryMBeans
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   238
 * queryMBeans} methods. See the
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   239
 * <a href="namespace/package-summary.html#RejectedNamespacePatterns"><!--
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   240
 * -->namespaces documentation</a> for more details.
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   241
 * </p>
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
   242
 *
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
 * <p>An ObjectName can be written as a String with the following
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
 * elements in order:</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
 * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
 * <li>The domain.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
 * <li>A colon (<code>:</code>).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
 * <li>A key property list as defined below.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
 * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
 * <p>A key property list written as a String is a comma-separated
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
 * list of elements.  Each element is either an asterisk or a key
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
 * property.  A key property consists of a key, an equals
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
 * (<code>=</code>), and the associated value.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
 * <p>At most one element of a key property list may be an asterisk.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
 * If the key property list contains an asterisk element, the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
 * ObjectName is a property list pattern.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
 * <p>Spaces have no special significance in a String representing an
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
 * ObjectName.  For example, the String:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
 * <pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
 * domain: key1 = value1 , key2 = value2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
 * </pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
 * represents an ObjectName with two keys.  The name of each key
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
 * contains six characters, of which the first and last are spaces.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
 * The value associated with the key <code>"&nbsp;key1&nbsp;"</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
 * also begins and ends with a space.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
 * <p>In addition to the restrictions on characters spelt out above,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
 * no part of an ObjectName may contain a newline character
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
 * (<code>'\n'</code>), whether the domain, a key, or a value, whether
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
 * quoted or unquoted.  The newline character can be represented in a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
 * quoted value with the sequence <code>\n</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
 * <p>The rules on special characters and quoting apply regardless of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
 * which constructor is used to make an ObjectName.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
 * <p>To avoid collisions between MBeans supplied by different
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
 * vendors, a useful convention is to begin the domain name with the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
 * reverse DNS name of the organization that specifies the MBeans,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
 * followed by a period and a string whose interpretation is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
 * determined by that organization.  For example, MBeans specified by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
 * Sun Microsystems Inc., DNS name <code>sun.com</code>, would have
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
 * domains such as <code>com.sun.MyDomain</code>.  This is essentially
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
 * the same convention as for Java-language package names.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
 * <p>The <b>serialVersionUID</b> of this class is <code>1081892073854801359L</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
 * @since 1.5
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
@SuppressWarnings("serial") // don't complain serialVersionUID not constant
471
422ff0db58d3 6692027: Custom subclasses of QueryEval don't serialize
emcmanus
parents: 287
diff changeset
   294
public class ObjectName implements Comparable<ObjectName>, QueryExp {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
    /**
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   297
     * The sequence of characters used to separate name spaces in a name space
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   298
     * path.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   299
     *
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   300
     * @see javax.management.namespace
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   301
     * @since 1.7
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   302
     **/
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   303
    public static final String NAMESPACE_SEPARATOR = "//";
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   304
    private static final int NAMESPACE_SEPARATOR_LENGTH =
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   305
            NAMESPACE_SEPARATOR.length();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   306
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   307
    /**
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
     * A structure recording property structure and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
     * proposing minimal services
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
    private static class Property {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
        int _key_index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
        int _key_length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
        int _value_length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
         * Constructor.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
        Property(int key_index, int key_length, int value_length) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
            _key_index = key_index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
            _key_length = key_length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
            _value_length = value_length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
         * Assigns the key index of property
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
        void setKeyIndex(int key_index) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
            _key_index = key_index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
         * Returns a key string for receiver key
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
         */
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   336
        String getKeyString(String name, int offset) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   337
            final int start = _key_index+offset;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   338
            return name.substring(start, start + _key_length);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
         * Returns a value string for receiver key
90ce3da70b43 Initial load
duke
parents:
diff changeset
   343
         */
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   344
        String getValueString(String name, int offset) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   345
            final int in_begin = _key_index + offset + _key_length + 1;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   346
            final int out_end = in_begin + _value_length;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
            return name.substring(in_begin, out_end);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
     * Marker class for value pattern property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
    private static class PatternProperty extends Property {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
         * Constructor.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   357
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
        PatternProperty(int key_index, int key_length, int value_length) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   359
            super(key_index, key_length, value_length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   361
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
90ce3da70b43 Initial load
duke
parents:
diff changeset
   363
    // Inner classes <========================================
90ce3da70b43 Initial load
duke
parents:
diff changeset
   364
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
90ce3da70b43 Initial load
duke
parents:
diff changeset
   366
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
    // Private fields ---------------------------------------->
90ce3da70b43 Initial load
duke
parents:
diff changeset
   368
90ce3da70b43 Initial load
duke
parents:
diff changeset
   369
90ce3da70b43 Initial load
duke
parents:
diff changeset
   370
    // Serialization compatibility stuff -------------------->
90ce3da70b43 Initial load
duke
parents:
diff changeset
   371
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
    // Two serial forms are supported in this class. The selected form depends
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
    // on system property "jmx.serial.form":
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
    //  - "1.0" for JMX 1.0
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
    //  - any other value for JMX 1.1 and higher
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
    //
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
    // Serial version for old serial form
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
    private static final long oldSerialVersionUID = -5467795090068647408L;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   379
    //
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
    // Serial version for new serial form
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
    private static final long newSerialVersionUID = 1081892073854801359L;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
    //
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
    // Serializable fields in old serial form
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
    private static final ObjectStreamField[] oldSerialPersistentFields =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
        new ObjectStreamField("domain", String.class),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
        new ObjectStreamField("propertyList", Hashtable.class),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
        new ObjectStreamField("propertyListString", String.class),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
        new ObjectStreamField("canonicalName", String.class),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   390
        new ObjectStreamField("pattern", Boolean.TYPE),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   391
        new ObjectStreamField("propertyPattern", Boolean.TYPE)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   392
    };
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
    //
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
    // Serializable fields in new serial form
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
    private static final ObjectStreamField[] newSerialPersistentFields = { };
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
    //
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
    // Actual serial version and serial form
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
    private static final long serialVersionUID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   399
    private static final ObjectStreamField[] serialPersistentFields;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   400
    private static boolean compat = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   401
    static {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   402
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   403
            GetPropertyAction act = new GetPropertyAction("jmx.serial.form");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   404
            String form = AccessController.doPrivileged(act);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   405
            compat = (form != null && form.equals("1.0"));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
        } catch (Exception e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
            // OK: exception means no compat with 1.0, too bad
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
        if (compat) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   410
            serialPersistentFields = oldSerialPersistentFields;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
            serialVersionUID = oldSerialVersionUID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
            serialPersistentFields = newSerialPersistentFields;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
            serialVersionUID = newSerialVersionUID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
    //
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
    // Serialization compatibility stuff <==============================
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
    // Class private fields ----------------------------------->
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
     * a shared empty array for empty property lists
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
    static final private Property[] _Empty_property_array = new Property[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
    // Class private fields <==============================
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
    // Instance private fields ----------------------------------->
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
     * a String containing the canonical name
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
    private transient String _canonicalName;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
     * An array of properties in the same seq order as time creation
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
    private transient Property[] _kp_array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
     * An array of properties in the same seq order as canonical order
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
    private transient Property[] _ca_array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   451
     * The length of the domain part of built objectname
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
    private transient int _domain_length = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
     * The propertyList of built object name. Initialized lazily.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
     * Table that contains all the pairs (key,value) for this ObjectName.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
    private transient Map<String,String> _propertyList;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
     * boolean that declares if this ObjectName domain part is a pattern
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
    private transient boolean _domain_pattern = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
     * boolean that declares if this ObjectName contains a pattern on the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
     * key property list
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
    private transient boolean _property_list_pattern = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
     * boolean that declares if this ObjectName contains a pattern on the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
     * value of at least one key property
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
    private transient boolean _property_value_pattern = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   478
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   479
    private ObjectName(String newDomain, ObjectName aname)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   480
        throws MalformedObjectNameException{
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   481
        copyToOtherDomain(newDomain,aname);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   482
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   483
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   484
    private void copyToOtherDomain(String domain, ObjectName aname)
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
   485
        throws MalformedObjectNameException {
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   486
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   487
        // The domain cannot be null
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   488
        if (domain == null)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   489
            throw new NullPointerException("domain cannot be null");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   490
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   491
        // The key property list cannot be null
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   492
        if (aname == null)
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   493
            throw new MalformedObjectNameException(
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   494
                        "key property list cannot be empty");
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   495
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   496
        // checks domain validity. A side effect of this method is also to
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   497
        // set the _domain_pattern flag.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   498
        if (!isDomain(domain))
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   499
            throw new MalformedObjectNameException("Invalid domain: " + domain);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   500
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   501
        // init canonicalname
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   502
        _domain_length = domain.length();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   503
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   504
        _canonicalName = (domain +
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   505
             aname._canonicalName.substring(aname._domain_length)).intern();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   506
        _kp_array = aname._kp_array;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   507
        _ca_array = aname._ca_array;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   508
        _propertyList = aname._propertyList;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   509
        _property_list_pattern = aname._property_list_pattern;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   510
        _property_value_pattern = aname._property_value_pattern;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   511
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   512
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
    // Instance private fields <=======================================
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
    // Private fields <========================================
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
    //  Private methods ---------------------------------------->
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
    // Category : Instance construction ------------------------->
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
     * Initializes this {@link ObjectName} from the given string
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
     * representation.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
     * @param name A string representation of the {@link ObjectName}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
     * @exception MalformedObjectNameException The string passed as a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
     * parameter does not have the right format.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
     * @exception NullPointerException The <code>name</code> parameter
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
     * is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
    private void construct(String name)
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
   534
        throws MalformedObjectNameException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
        // The name cannot be null
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
        if (name == null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
            throw new NullPointerException("name cannot be null");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
        // Test if the name is empty
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
        if (name.length() == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
            // this is equivalent to the whole word query object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
            _canonicalName = "*:*";
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
            _kp_array = _Empty_property_array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
            _ca_array = _Empty_property_array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
            _domain_length = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
            _propertyList = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
            _domain_pattern = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
            _property_list_pattern = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
            _property_value_pattern = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   553
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
        // initialize parsing of the string
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   555
        final char[] name_chars = name.toCharArray();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   556
        final int len = name_chars.length;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   557
        final char[] canonical_chars = new char[len]; // canonical form will
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   558
                                                      // be same length at most
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
        int cname_index = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   560
        int index = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
        char c, c1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
90ce3da70b43 Initial load
duke
parents:
diff changeset
   563
        // parses domain part
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
    domain_parsing:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
        while (index < len) {
526
61ba2d5ea9da 6701459: Synchronization bug pattern found in javax.management.relation.RelationService
emcmanus
parents: 471
diff changeset
   566
            switch (name_chars[index]) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   567
                case ':' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   568
                    _domain_length = index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   569
                    break domain_parsing;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   570
                case '=' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   571
                    // ":" omission check.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   572
                    //
90ce3da70b43 Initial load
duke
parents:
diff changeset
   573
                    // Although "=" is a valid character in the domain part
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
                    // it is true that it is rarely used in the real world.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   575
                    // So check straight away if the ":" has been omitted
90ce3da70b43 Initial load
duke
parents:
diff changeset
   576
                    // from the ObjectName. This allows us to provide a more
90ce3da70b43 Initial load
duke
parents:
diff changeset
   577
                    // accurate exception message.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   578
                    int i = ++index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   579
                    while ((i < len) && (name_chars[i++] != ':'))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   580
                        if (i == len)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   581
                            throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   582
                                "Domain part must be specified");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   584
                case '\n' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   585
                    throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   586
                              "Invalid character '\\n' in domain name");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   587
                case '*' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
                case '?' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   589
                    _domain_pattern = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   590
                    index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   591
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
                default :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
                    index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
90ce3da70b43 Initial load
duke
parents:
diff changeset
   598
        // check for non-empty properties
90ce3da70b43 Initial load
duke
parents:
diff changeset
   599
        if (index == len)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   600
            throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   601
                                         "Key properties cannot be empty");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   602
90ce3da70b43 Initial load
duke
parents:
diff changeset
   603
        // we have got the domain part, begins building of _canonicalName
90ce3da70b43 Initial load
duke
parents:
diff changeset
   604
        System.arraycopy(name_chars, 0, canonical_chars, 0, _domain_length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   605
        canonical_chars[_domain_length] = ':';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   606
        cname_index = _domain_length + 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   607
90ce3da70b43 Initial load
duke
parents:
diff changeset
   608
        // parses property list
90ce3da70b43 Initial load
duke
parents:
diff changeset
   609
        Property prop;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   610
        Map<String,Property> keys_map = new HashMap<String,Property>();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   611
        String[] keys;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   612
        String key_name;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   613
        boolean quoted_value;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   614
        int property_index = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   615
        int in_index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   616
        int key_index, key_length, value_index, value_length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   617
90ce3da70b43 Initial load
duke
parents:
diff changeset
   618
        keys = new String[10];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   619
        _kp_array = new Property[10];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   620
        _property_list_pattern = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   621
        _property_value_pattern = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
        while (index < len) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   624
            c = name_chars[index];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   625
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
            // case of pattern properties
90ce3da70b43 Initial load
duke
parents:
diff changeset
   627
            if (c == '*') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   628
                if (_property_list_pattern)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   629
                    throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
                              "Cannot have several '*' characters in pattern " +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
                              "property list");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
                else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
                    _property_list_pattern = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
                    if ((++index < len ) && (name_chars[index] != ','))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
                        throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
                                  "Invalid character found after '*': end of " +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
                                  "name or ',' expected");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   638
                    else if (index == len) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
                        if (property_index == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
                            // empty properties case
90ce3da70b43 Initial load
duke
parents:
diff changeset
   641
                            _kp_array = _Empty_property_array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   642
                            _ca_array = _Empty_property_array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   643
                            _propertyList = Collections.emptyMap();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   644
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   645
                        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   647
                        // correct pattern spec in props, continue
90ce3da70b43 Initial load
duke
parents:
diff changeset
   648
                        index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   649
                        continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   650
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   651
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
90ce3da70b43 Initial load
duke
parents:
diff changeset
   654
            // standard property case, key part
90ce3da70b43 Initial load
duke
parents:
diff changeset
   655
            in_index = index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
            key_index = in_index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
            if (name_chars[in_index] == '=')
90ce3da70b43 Initial load
duke
parents:
diff changeset
   658
                throw new MalformedObjectNameException("Invalid key (empty)");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
            while ((in_index < len) && ((c1 = name_chars[in_index++]) != '='))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
                switch (c1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
                    // '=' considered to introduce value part
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
                    case  '*' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
                    case  '?' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   664
                    case  ',' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
                    case  ':' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
                    case  '\n' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
                        final String ichar = ((c1=='\n')?"\\n":""+c1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
                        throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   669
                                  "Invalid character '" + ichar +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   670
                                  "' in key part of property");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   671
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
            if (name_chars[in_index - 1] != '=')
90ce3da70b43 Initial load
duke
parents:
diff changeset
   673
                throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   674
                                             "Unterminated key property part");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   675
            value_index = in_index; // in_index pointing after '=' char
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
            key_length = value_index - key_index - 1; // found end of key
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
            // standard property case, value part
90ce3da70b43 Initial load
duke
parents:
diff changeset
   679
            boolean value_pattern = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   680
            if (in_index < len && name_chars[in_index] == '\"') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
                quoted_value = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   682
                // the case of quoted value part
90ce3da70b43 Initial load
duke
parents:
diff changeset
   683
            quoted_value_parsing:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
                while ((++in_index < len) &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
                       ((c1 = name_chars[in_index]) != '\"')) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
                    // the case of an escaped character
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
                    if (c1 == '\\') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
                        if (++in_index == len)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
                            throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
                                               "Unterminated quoted value");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
                        switch (c1 = name_chars[in_index]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
                            case '\\' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
                            case '\"' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
                            case '?' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   695
                            case '*' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
                            case 'n' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
                                break; // valid character
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
                            default :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
                                throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
                                          "Invalid escape sequence '\\" +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
                                          c1 + "' in quoted value");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   703
                    } else if (c1 == '\n') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   704
                        throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
                                                     "Newline in quoted value");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
                        switch (c1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   708
                            case '?' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
                            case '*' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
                                value_pattern = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
                                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   712
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   714
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   715
                if (in_index == len)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   716
                    throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   717
                                                 "Unterminated quoted value");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
                else value_length = ++in_index - value_index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
                // the case of standard value part
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
                quoted_value = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
                while ((in_index < len) && ((c1 = name_chars[in_index]) != ','))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
                switch (c1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
                    // ',' considered to be the value separator
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
                    case '*' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   726
                    case '?' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
                        value_pattern = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
                        in_index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
                        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   730
                    case '=' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
                    case ':' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
                    case '"' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
                    case '\n' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   734
                        final String ichar = ((c1=='\n')?"\\n":""+c1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   735
                        throw new MalformedObjectNameException(
526
61ba2d5ea9da 6701459: Synchronization bug pattern found in javax.management.relation.RelationService
emcmanus
parents: 471
diff changeset
   736
                                                 "Invalid character '" + ichar +
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   737
                                                 "' in value part of property");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
                    default :
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
                        in_index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   740
                        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   741
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   742
                value_length = in_index - value_index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   743
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   744
90ce3da70b43 Initial load
duke
parents:
diff changeset
   745
            // Parsed property, checks the end of name
90ce3da70b43 Initial load
duke
parents:
diff changeset
   746
            if (in_index == len - 1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
                if (quoted_value)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
                    throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   749
                                             "Invalid ending character `" +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   750
                                             name_chars[in_index] + "'");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
                else throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
                                                  "Invalid ending comma");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
            } else in_index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
90ce3da70b43 Initial load
duke
parents:
diff changeset
   755
            // we got the key and value part, prepare a property for this
90ce3da70b43 Initial load
duke
parents:
diff changeset
   756
            if (!value_pattern) {
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   757
                prop = new Property(key_index-_domain_length,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   758
                                    key_length, value_length);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   759
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   760
                _property_value_pattern = true;
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   761
                prop = new PatternProperty(key_index-_domain_length,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   762
                                    key_length, value_length);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   763
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   764
            key_name = name.substring(key_index, key_index + key_length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   765
90ce3da70b43 Initial load
duke
parents:
diff changeset
   766
            if (property_index == keys.length) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   767
                String[] tmp_string_array = new String[property_index + 10];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   768
                System.arraycopy(keys, 0, tmp_string_array, 0, property_index);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   769
                keys = tmp_string_array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   770
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   771
            keys[property_index] = key_name;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   772
90ce3da70b43 Initial load
duke
parents:
diff changeset
   773
            addProperty(prop, property_index, keys_map, key_name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   774
            property_index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   775
            index = in_index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   776
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   777
90ce3da70b43 Initial load
duke
parents:
diff changeset
   778
        // computes and set canonical name
90ce3da70b43 Initial load
duke
parents:
diff changeset
   779
        setCanonicalName(name_chars, canonical_chars, keys,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   780
                         keys_map, cname_index, property_index);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   781
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   782
90ce3da70b43 Initial load
duke
parents:
diff changeset
   783
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   784
     * Construct an ObjectName from a domain and a Hashtable.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   785
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   786
     * @param domain Domain of the ObjectName.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   787
     * @param props  Map containing couples <i>key</i> -> <i>value</i>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   788
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   789
     * @exception MalformedObjectNameException The <code>domain</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   790
     * contains an illegal character, or one of the keys or values in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   791
     * <code>table</code> contains an illegal character, or one of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   792
     * values in <code>table</code> does not follow the rules for quoting.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   793
     * @exception NullPointerException One of the parameters is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   794
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   795
    private void construct(String domain, Map<String,String> props)
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
   796
        throws MalformedObjectNameException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   797
90ce3da70b43 Initial load
duke
parents:
diff changeset
   798
        // The domain cannot be null
90ce3da70b43 Initial load
duke
parents:
diff changeset
   799
        if (domain == null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   800
            throw new NullPointerException("domain cannot be null");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   801
90ce3da70b43 Initial load
duke
parents:
diff changeset
   802
        // The key property list cannot be null
90ce3da70b43 Initial load
duke
parents:
diff changeset
   803
        if (props == null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   804
            throw new NullPointerException("key property list cannot be null");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   805
90ce3da70b43 Initial load
duke
parents:
diff changeset
   806
        // The key property list cannot be empty
90ce3da70b43 Initial load
duke
parents:
diff changeset
   807
        if (props.isEmpty())
90ce3da70b43 Initial load
duke
parents:
diff changeset
   808
            throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   809
                                         "key property list cannot be empty");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   810
90ce3da70b43 Initial load
duke
parents:
diff changeset
   811
        // checks domain validity
90ce3da70b43 Initial load
duke
parents:
diff changeset
   812
        if (!isDomain(domain))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   813
            throw new MalformedObjectNameException("Invalid domain: " + domain);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   814
90ce3da70b43 Initial load
duke
parents:
diff changeset
   815
        // init canonicalname
90ce3da70b43 Initial load
duke
parents:
diff changeset
   816
        final StringBuilder sb = new StringBuilder();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   817
        sb.append(domain).append(':');
90ce3da70b43 Initial load
duke
parents:
diff changeset
   818
        _domain_length = domain.length();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   819
90ce3da70b43 Initial load
duke
parents:
diff changeset
   820
        // allocates the property array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   821
        int nb_props = props.size();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   822
        _kp_array = new Property[nb_props];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   823
90ce3da70b43 Initial load
duke
parents:
diff changeset
   824
        String[] keys = new String[nb_props];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   825
        final Map<String,Property> keys_map = new HashMap<String,Property>();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   826
        Property prop;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   827
        int key_index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   828
        int i = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   829
        for (Map.Entry<String,String> entry : props.entrySet()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   830
            if (sb.length() > 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   831
                sb.append(",");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   832
            String key = entry.getKey();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   833
            String value;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   834
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   835
                value = entry.getValue();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   836
            } catch (ClassCastException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   837
                throw new MalformedObjectNameException(e.getMessage());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   838
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   839
            key_index = sb.length();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   840
            checkKey(key);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   841
            sb.append(key);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   842
            keys[i] = key;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   843
            sb.append("=");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   844
            boolean value_pattern = checkValue(value);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   845
            sb.append(value);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   846
            if (!value_pattern) {
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   847
                prop = new Property(key_index-_domain_length,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   848
                                    key.length(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   849
                                    value.length());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   850
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   851
                _property_value_pattern = true;
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   852
                prop = new PatternProperty(key_index-_domain_length,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   853
                                           key.length(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   854
                                           value.length());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   855
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   856
            addProperty(prop, i, keys_map, key);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   857
            i++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   858
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   859
90ce3da70b43 Initial load
duke
parents:
diff changeset
   860
        // initialize canonical name and data structure
90ce3da70b43 Initial load
duke
parents:
diff changeset
   861
        int len = sb.length();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   862
        char[] initial_chars = new char[len];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   863
        sb.getChars(0, len, initial_chars, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   864
        char[] canonical_chars = new char[len];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   865
        System.arraycopy(initial_chars, 0, canonical_chars, 0,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   866
                         _domain_length + 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   867
        setCanonicalName(initial_chars, canonical_chars, keys, keys_map,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   868
                         _domain_length + 1, _kp_array.length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   869
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   870
    // Category : Instance construction <==============================
90ce3da70b43 Initial load
duke
parents:
diff changeset
   871
90ce3da70b43 Initial load
duke
parents:
diff changeset
   872
    // Category : Internal utilities ------------------------------>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   873
90ce3da70b43 Initial load
duke
parents:
diff changeset
   874
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   875
     * Add passed property to the list at the given index
90ce3da70b43 Initial load
duke
parents:
diff changeset
   876
     * for the passed key name
90ce3da70b43 Initial load
duke
parents:
diff changeset
   877
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   878
    private void addProperty(Property prop, int index,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   879
                             Map<String,Property> keys_map, String key_name)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   880
        throws MalformedObjectNameException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   881
90ce3da70b43 Initial load
duke
parents:
diff changeset
   882
        if (keys_map.containsKey(key_name)) throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
   883
                MalformedObjectNameException("key `" +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   884
                                         key_name +"' already defined");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   885
90ce3da70b43 Initial load
duke
parents:
diff changeset
   886
        // if no more space for property arrays, have to increase it
90ce3da70b43 Initial load
duke
parents:
diff changeset
   887
        if (index == _kp_array.length) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   888
            Property[] tmp_prop_array = new Property[index + 10];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   889
            System.arraycopy(_kp_array, 0, tmp_prop_array, 0, index);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   890
            _kp_array = tmp_prop_array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   891
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   892
        _kp_array[index] = prop;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   893
        keys_map.put(key_name, prop);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   894
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   895
90ce3da70b43 Initial load
duke
parents:
diff changeset
   896
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   897
     * Sets the canonical name of receiver from input 'specified_chars'
90ce3da70b43 Initial load
duke
parents:
diff changeset
   898
     * array, by filling 'canonical_chars' array with found 'nb-props'
90ce3da70b43 Initial load
duke
parents:
diff changeset
   899
     * properties starting at position 'prop_index'.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   900
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   901
    private void setCanonicalName(char[] specified_chars,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   902
                                  char[] canonical_chars,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   903
                                  String[] keys, Map<String,Property> keys_map,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   904
                                  int prop_index, int nb_props) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   905
90ce3da70b43 Initial load
duke
parents:
diff changeset
   906
        // Sort the list of found properties
90ce3da70b43 Initial load
duke
parents:
diff changeset
   907
        if (_kp_array != _Empty_property_array) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   908
            String[] tmp_keys = new String[nb_props];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   909
            Property[] tmp_props = new Property[nb_props];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   910
90ce3da70b43 Initial load
duke
parents:
diff changeset
   911
            System.arraycopy(keys, 0, tmp_keys, 0, nb_props);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   912
            Arrays.sort(tmp_keys);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   913
            keys = tmp_keys;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   914
            System.arraycopy(_kp_array, 0, tmp_props, 0 , nb_props);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   915
            _kp_array = tmp_props;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   916
            _ca_array = new Property[nb_props];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   917
90ce3da70b43 Initial load
duke
parents:
diff changeset
   918
            // now assigns _ca_array to the sorted list of keys
90ce3da70b43 Initial load
duke
parents:
diff changeset
   919
            // (there cannot be two identical keys in an objectname.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   920
            for (int i = 0; i < nb_props; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   921
                _ca_array[i] = keys_map.get(keys[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   922
90ce3da70b43 Initial load
duke
parents:
diff changeset
   923
            // now we build the canonical name and set begin indexes of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   924
            // properties to reflect canonical form
90ce3da70b43 Initial load
duke
parents:
diff changeset
   925
            int last_index = nb_props - 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   926
            int prop_len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   927
            Property prop;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   928
            for (int i = 0; i <= last_index; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   929
                prop = _ca_array[i];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   930
                // length of prop including '=' char
90ce3da70b43 Initial load
duke
parents:
diff changeset
   931
                prop_len = prop._key_length + prop._value_length + 1;
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   932
                System.arraycopy(specified_chars, prop._key_index+_domain_length,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   933
                                 canonical_chars, prop_index, prop_len);
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
   934
                prop.setKeyIndex(prop_index-_domain_length);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   935
                prop_index += prop_len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   936
                if (i != last_index) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   937
                    canonical_chars[prop_index] = ',';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   938
                    prop_index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   939
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   940
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   941
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   942
90ce3da70b43 Initial load
duke
parents:
diff changeset
   943
        // terminate canonicalname with '*' in case of pattern
90ce3da70b43 Initial load
duke
parents:
diff changeset
   944
        if (_property_list_pattern) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   945
            if (_kp_array != _Empty_property_array)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   946
                canonical_chars[prop_index++] = ',';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   947
            canonical_chars[prop_index++] = '*';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   948
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   949
90ce3da70b43 Initial load
duke
parents:
diff changeset
   950
        // we now build the canonicalname string
90ce3da70b43 Initial load
duke
parents:
diff changeset
   951
        _canonicalName = (new String(canonical_chars, 0, prop_index)).intern();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   952
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   953
90ce3da70b43 Initial load
duke
parents:
diff changeset
   954
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   955
     * Parse a key.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   956
     * <pre>final int endKey=parseKey(s,startKey);</pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   957
     * <p>key starts at startKey (included), and ends at endKey (excluded).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   958
     * If (startKey == endKey), then the key is empty.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   959
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   960
     * @param s The char array of the original string.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   961
     * @param startKey index at which to begin parsing.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   962
     * @return The index following the last character of the key.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   963
     **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   964
    private static int parseKey(final char[] s, final int startKey)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   965
        throws MalformedObjectNameException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   966
        int next   = startKey;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   967
        int endKey = startKey;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   968
        final int len = s.length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   969
        while (next < len) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   970
            final char k = s[next++];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   971
            switch (k) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   972
            case '*':
90ce3da70b43 Initial load
duke
parents:
diff changeset
   973
            case '?':
90ce3da70b43 Initial load
duke
parents:
diff changeset
   974
            case ',':
90ce3da70b43 Initial load
duke
parents:
diff changeset
   975
            case ':':
90ce3da70b43 Initial load
duke
parents:
diff changeset
   976
            case '\n':
90ce3da70b43 Initial load
duke
parents:
diff changeset
   977
                final String ichar = ((k=='\n')?"\\n":""+k);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   978
                throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
   979
                    MalformedObjectNameException("Invalid character in key: `"
90ce3da70b43 Initial load
duke
parents:
diff changeset
   980
                                                 + ichar + "'");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   981
            case '=':
90ce3da70b43 Initial load
duke
parents:
diff changeset
   982
                // we got the key.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   983
                endKey = next-1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   984
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   985
            default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   986
                if (next < len) continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   987
                else endKey=next;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   988
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   989
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   990
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   991
        return endKey;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   992
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   993
90ce3da70b43 Initial load
duke
parents:
diff changeset
   994
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   995
     * Parse a value.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   996
     * <pre>final int endVal=parseValue(s,startVal);</pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   997
     * <p>value starts at startVal (included), and ends at endVal (excluded).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   998
     * If (startVal == endVal), then the key is empty.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   999
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1000
     * @param s The char array of the original string.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1001
     * @param startValue index at which to begin parsing.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1002
     * @return The first element of the int array indicates the index
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1003
     *         following the last character of the value. The second
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1004
     *         element of the int array indicates that the value is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1005
     *         a pattern when its value equals 1.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1006
     **/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1007
    private static int[] parseValue(final char[] s, final int startValue)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1008
        throws MalformedObjectNameException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1009
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1010
        boolean value_pattern = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1011
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1012
        int next   = startValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1013
        int endValue = startValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1014
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1015
        final int len = s.length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1016
        final char q=s[startValue];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1017
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1018
        if (q == '"') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1019
            // quoted value
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1020
            if (++next == len) throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1021
                MalformedObjectNameException("Invalid quote");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1022
            while (next < len) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1023
                char last = s[next];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1024
                if (last == '\\') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1025
                    if (++next == len) throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1026
                        MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1027
                           "Invalid unterminated quoted character sequence");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1028
                    last = s[next];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1029
                    switch (last) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1030
                        case '\\' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1031
                        case '?' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1032
                        case '*' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1033
                        case 'n' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1034
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1035
                        case '\"' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1036
                            // We have an escaped quote. If this escaped
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1037
                            // quote is the last character, it does not
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1038
                            // qualify as a valid termination quote.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1039
                            //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1040
                            if (next+1 == len) throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1041
                                MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1042
                                                 "Missing termination quote");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1043
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1044
                        default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1045
                            throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1046
                                MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1047
                                "Invalid quoted character sequence '\\" +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1048
                                last + "'");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1049
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1050
                } else if (last == '\n') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1051
                    throw new MalformedObjectNameException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1052
                                                 "Newline in quoted value");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1053
                } else if (last == '\"') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1054
                    next++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1055
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1056
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1057
                    switch (last) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1058
                        case '?' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1059
                        case '*' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1060
                            value_pattern = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1061
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1062
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1063
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1064
                next++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1065
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1066
                // Check that last character is a termination quote.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1067
                // We have already handled the case were the last
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1068
                // character is an escaped quote earlier.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1069
                //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1070
                if ((next >= len) && (last != '\"')) throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1071
                    MalformedObjectNameException("Missing termination quote");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1072
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1073
            endValue = next;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1074
            if (next < len) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1075
                if (s[next++] != ',') throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1076
                    MalformedObjectNameException("Invalid quote");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1077
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1078
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1079
            // Non quoted value.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1080
            while (next < len) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1081
                final char v=s[next++];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1082
                switch(v) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1083
                    case '*':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1084
                    case '?':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1085
                        value_pattern = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1086
                        if (next < len) continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1087
                        else endValue=next;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1088
                        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1089
                    case '=':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1090
                    case ':':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1091
                    case '\n' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1092
                        final String ichar = ((v=='\n')?"\\n":""+v);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1093
                        throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1094
                            MalformedObjectNameException("Invalid character `" +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1095
                                                         ichar + "' in value");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1096
                    case ',':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1097
                        endValue = next-1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1098
                        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1099
                    default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1100
                        if (next < len) continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1101
                        else endValue=next;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1102
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1103
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1104
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1105
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1106
        return new int[] { endValue, value_pattern ? 1 : 0 };
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1107
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1108
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1109
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1110
     * Check if the supplied value is a valid value.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1111
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1112
     * @return true if the value is a pattern, otherwise false.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1113
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1114
    private static boolean checkValue(String val)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1115
        throws MalformedObjectNameException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1116
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1117
        if (val == null) throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1118
            NullPointerException("Invalid value (null)");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1119
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1120
        final int len = val.length();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1121
        if (len == 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1122
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1123
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1124
        final char[] s = val.toCharArray();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1125
        final int[] result = parseValue(s,0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1126
        final int endValue = result[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1127
        final boolean value_pattern = result[1] == 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1128
        if (endValue < len) throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1129
            MalformedObjectNameException("Invalid character in value: `" +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1130
                                         s[endValue] + "'");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1131
        return value_pattern;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1132
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1133
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1134
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1135
     * Check if the supplied key is a valid key.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1136
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1137
    private static void checkKey(String key)
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1138
        throws MalformedObjectNameException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1139
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1140
        if (key == null) throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1141
            NullPointerException("Invalid key (null)");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1142
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1143
        final int len = key.length();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1144
        if (len == 0) throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1145
            MalformedObjectNameException("Invalid key (empty)");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1146
        final char[] k=key.toCharArray();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1147
        final int endKey = parseKey(k,0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1148
        if (endKey < len) throw new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1149
            MalformedObjectNameException("Invalid character in value: `" +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1150
                                         k[endKey] + "'");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1151
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1152
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1153
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1154
    // Category : Internal utilities <==============================
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1155
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1156
    // Category : Internal accessors ------------------------------>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1157
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1158
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1159
     * Check if domain is a valid domain.  Set _domain_pattern if appropriate.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1160
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1161
    private boolean isDomain(String domain) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1162
        if (domain == null) return true;
1709
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1163
        final int len = domain.length();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1164
        int next = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1165
        while (next < len) {
1709
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1166
            final char c = domain.charAt(next++);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1167
            switch (c) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1168
                case ':' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1169
                case '\n' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1170
                    return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1171
                case '*' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1172
                case '?' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1173
                    _domain_pattern = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1174
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1175
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1176
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1177
        return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1178
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1179
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1180
    // Category : Internal accessors <==============================
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1181
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1182
    // Category : Serialization ----------------------------------->
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1183
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1184
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1185
     * Deserializes an {@link ObjectName} from an {@link ObjectInputStream}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1186
     * @serialData <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1187
     *               <li>In the current serial form (value of property
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1188
     *                   <code>jmx.serial.form</code> differs from
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1189
     *                   <code>1.0</code>): the string
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1190
     *                   &quot;&lt;domain&gt;:&lt;properties&gt;&lt;wild&gt;&quot;,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1191
     *                   where: <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1192
     *                            <li>&lt;domain&gt; represents the domain part
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1193
     *                                of the {@link ObjectName}</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1194
     *                            <li>&lt;properties&gt; represents the list of
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1195
     *                                properties, as returned by
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1196
     *                                {@link #getKeyPropertyListString}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1197
     *                            <li>&lt;wild&gt; is empty if not
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1198
     *                                <code>isPropertyPattern</code>, or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1199
     *                                is the character "<code>*</code>" if
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1200
     *                                <code>isPropertyPattern</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1201
     *                                and &lt;properties&gt; is empty, or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1202
     *                                is "<code>,*</code>" if
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1203
     *                                <code>isPropertyPattern</code> and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1204
     *                                &lt;properties&gt; is not empty.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1205
     *                            </li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1206
     *                          </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1207
     *                   The intent is that this string could be supplied
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1208
     *                   to the {@link #ObjectName(String)} constructor to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1209
     *                   produce an equivalent {@link ObjectName}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1210
     *               </li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1211
     *               <li>In the old serial form (value of property
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1212
     *                   <code>jmx.serial.form</code> is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1213
     *                   <code>1.0</code>): &lt;domain&gt; &lt;propertyList&gt;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1214
     *                   &lt;propertyListString&gt; &lt;canonicalName&gt;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1215
     *                   &lt;pattern&gt; &lt;propertyPattern&gt;,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1216
     *                   where: <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1217
     *                            <li>&lt;domain&gt; represents the domain part
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1218
     *                                of the {@link ObjectName}</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1219
     *                            <li>&lt;propertyList&gt; is the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1220
     *                                {@link Hashtable} that contains all the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1221
     *                                pairs (key,value) for this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1222
     *                                {@link ObjectName}</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1223
     *                            <li>&lt;propertyListString&gt; is the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1224
     *                                {@link String} representation of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1225
     *                                list of properties in any order (not
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1226
     *                                mandatorily a canonical representation)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1227
     *                                </li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1228
     *                            <li>&lt;canonicalName&gt; is the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1229
     *                                {@link String} containing this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1230
     *                                {@link ObjectName}'s canonical name</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1231
     *                            <li>&lt;pattern&gt; is a boolean which is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1232
     *                                <code>true</code> if this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1233
     *                                {@link ObjectName} contains a pattern</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1234
     *                            <li>&lt;propertyPattern&gt; is a boolean which
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1235
     *                                is <code>true</code> if this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1236
     *                                {@link ObjectName} contains a pattern in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1237
     *                                the list of properties</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1238
     *                          </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1239
     *               </li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1240
     *             </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1241
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1242
    private void readObject(ObjectInputStream in)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1243
        throws IOException, ClassNotFoundException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1244
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1245
        String cn;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1246
        if (compat) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1247
            // Read an object serialized in the old serial form
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1248
            //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1249
            //in.defaultReadObject();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1250
            final ObjectInputStream.GetField fields = in.readFields();
1005
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1251
            String propListString =
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1252
                    (String)fields.get("propertyListString", "");
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1253
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1254
            // 6616825: take care of property patterns
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1255
            final boolean propPattern =
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1256
                    fields.get("propertyPattern" , false);
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1257
            if (propPattern) {
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1258
                propListString =
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1259
                        (propListString.length()==0?"*":(propListString+",*"));
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1260
            }
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1261
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1262
            cn = (String)fields.get("domain", "default")+
1005
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  1263
                ":"+ propListString;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1264
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1265
            // Read an object serialized in the new serial form
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1266
            //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1267
            in.defaultReadObject();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1268
            cn = (String)in.readObject();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1269
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1270
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1271
        final JMXNamespaceContext ctxt =
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1272
                JMXNamespaceContext.getDeserializationContext();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1273
        try {
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1274
            construct(changeContext(ctxt,cn));
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1275
        } catch (NullPointerException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1276
            throw new InvalidObjectException(e.toString());
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1277
        } catch (IllegalArgumentException e) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1278
            throw new InvalidObjectException(e.toString());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1279
        } catch (MalformedObjectNameException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1280
            throw new InvalidObjectException(e.toString());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1281
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1282
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1283
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1284
    private String changeContext(JMXNamespaceContext context, String nameString) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1285
        final String old = context.prefixToRemove;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1286
        final String nw  = context.prefixToAdd;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1287
        final int ol = old.length();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1288
        if (nameString.startsWith(NAMESPACE_SEPARATOR)) return nameString;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1289
        if (ol>0) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1290
            if (!nameString.startsWith(old) ||
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1291
                    !nameString.startsWith(NAMESPACE_SEPARATOR,ol))
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1292
                throw new IllegalArgumentException(
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1293
                        "Serialized ObjectName does not start with " + old +
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1294
                        ": " + nameString);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1295
            nameString = nameString.substring(ol+NAMESPACE_SEPARATOR_LENGTH);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1296
        }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1297
        if (!nw.equals("")) {
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1298
            nameString = nw + NAMESPACE_SEPARATOR + nameString;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1299
        }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1300
        return nameString;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1301
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1302
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1303
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1304
     * Serializes an {@link ObjectName} to an {@link ObjectOutputStream}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1305
     * @serialData <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1306
     *               <li>In the current serial form (value of property
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1307
     *                   <code>jmx.serial.form</code> differs from
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1308
     *                   <code>1.0</code>): the string
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1309
     *                   &quot;&lt;domain&gt;:&lt;properties&gt;&lt;wild&gt;&quot;,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1310
     *                   where: <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1311
     *                            <li>&lt;domain&gt; represents the domain part
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1312
     *                                of the {@link ObjectName}</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1313
     *                            <li>&lt;properties&gt; represents the list of
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1314
     *                                properties, as returned by
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1315
     *                                {@link #getKeyPropertyListString}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1316
     *                            <li>&lt;wild&gt; is empty if not
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1317
     *                                <code>isPropertyPattern</code>, or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1318
     *                                is the character "<code>*</code>" if
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1319
     *                                this <code>isPropertyPattern</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1320
     *                                and &lt;properties&gt; is empty, or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1321
     *                                is "<code>,*</code>" if
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1322
     *                                <code>isPropertyPattern</code> and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1323
     *                                &lt;properties&gt; is not empty.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1324
     *                            </li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1325
     *                          </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1326
     *                   The intent is that this string could be supplied
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1327
     *                   to the {@link #ObjectName(String)} constructor to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1328
     *                   produce an equivalent {@link ObjectName}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1329
     *               </li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1330
     *               <li>In the old serial form (value of property
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1331
     *                   <code>jmx.serial.form</code> is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1332
     *                   <code>1.0</code>): &lt;domain&gt; &lt;propertyList&gt;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1333
     *                   &lt;propertyListString&gt; &lt;canonicalName&gt;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1334
     *                   &lt;pattern&gt; &lt;propertyPattern&gt;,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1335
     *                   where: <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1336
     *                            <li>&lt;domain&gt; represents the domain part
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1337
     *                                of the {@link ObjectName}</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1338
     *                            <li>&lt;propertyList&gt; is the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1339
     *                                {@link Hashtable} that contains all the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1340
     *                                pairs (key,value) for this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1341
     *                                {@link ObjectName}</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1342
     *                            <li>&lt;propertyListString&gt; is the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1343
     *                                {@link String} representation of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1344
     *                                list of properties in any order (not
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1345
     *                                mandatorily a canonical representation)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1346
     *                                </li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1347
     *                            <li>&lt;canonicalName&gt; is the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1348
     *                                {@link String} containing this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1349
     *                                {@link ObjectName}'s canonical name</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1350
     *                            <li>&lt;pattern&gt; is a boolean which is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1351
     *                                <code>true</code> if this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1352
     *                                {@link ObjectName} contains a pattern</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1353
     *                            <li>&lt;propertyPattern&gt; is a boolean which
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1354
     *                                is <code>true</code> if this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1355
     *                                {@link ObjectName} contains a pattern in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1356
     *                                the list of properties</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1357
     *                          </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1358
     *               </li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1359
     *             </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1360
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1361
    private void writeObject(ObjectOutputStream out)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1362
            throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1363
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1364
      final JMXNamespaceContext ctxt =
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1365
                JMXNamespaceContext.getSerializationContext();
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1366
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1367
      if (compat)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1368
      {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1369
        // Serializes this instance in the old serial form
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1370
        // Read CR 6441274 before making any changes to this code
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1371
        ObjectOutputStream.PutField fields = out.putFields();
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1372
        final String domain =
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1373
                changeContext(ctxt,_canonicalName.substring(0, _domain_length));
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1374
        final String cn =
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1375
                changeContext(ctxt,_canonicalName);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1376
        fields.put("domain", domain);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1377
        fields.put("propertyList", getKeyPropertyList());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1378
        fields.put("propertyListString", getKeyPropertyListString());
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1379
        fields.put("canonicalName", cn);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1380
        fields.put("pattern", (_domain_pattern || _property_list_pattern));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1381
        fields.put("propertyPattern", _property_list_pattern);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1382
        out.writeFields();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1383
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1384
      else
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1385
      {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1386
        // Serializes this instance in the new serial form
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1387
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1388
        out.defaultWriteObject();
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1389
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1390
        out.writeObject(changeContext(ctxt,getSerializedNameString()));
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1391
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1392
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1393
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1394
    //  Category : Serialization <===================================
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1395
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1396
    // Private methods <========================================
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1397
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1398
    // Public methods ---------------------------------------->
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1399
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1400
    // Category : ObjectName Construction ------------------------------>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1401
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1402
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1403
     * <p>Return an instance of ObjectName that can be used anywhere
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1404
     * an object obtained with {@link #ObjectName(String) new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1405
     * ObjectName(name)} can be used.  The returned object may be of
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1406
     * a subclass of ObjectName.  Calling this method twice with the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1407
     * same parameters may return the same object or two equal but
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1408
     * not identical objects.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1409
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1410
     * @param name  A string representation of the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1411
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1412
     * @return an ObjectName corresponding to the given String.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1413
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1414
     * @exception MalformedObjectNameException The string passed as a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1415
     * parameter does not have the right format.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1416
     * @exception NullPointerException The <code>name</code> parameter
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1417
     * is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1418
     *
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1419
     * @see #valueOf(String)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1420
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1421
    public static ObjectName getInstance(String name)
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1422
            throws MalformedObjectNameException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1423
        return new ObjectName(name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1424
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1425
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1426
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1427
     * <p>Return an instance of ObjectName that can be used anywhere
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1428
     * an object obtained with {@link #ObjectName(String, String,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1429
     * String) new ObjectName(domain, key, value)} can be used.  The
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1430
     * returned object may be of a subclass of ObjectName.  Calling
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1431
     * this method twice with the same parameters may return the same
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1432
     * object or two equal but not identical objects.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1433
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1434
     * @param domain  The domain part of the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1435
     * @param key  The attribute in the key property of the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1436
     * @param value The value in the key property of the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1437
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1438
     * @return an ObjectName corresponding to the given domain,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1439
     * key, and value.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1440
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1441
     * @exception MalformedObjectNameException The
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1442
     * <code>domain</code>, <code>key</code>, or <code>value</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1443
     * contains an illegal character, or <code>value</code> does not
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1444
     * follow the rules for quoting.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1445
     * @exception NullPointerException One of the parameters is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1446
     *
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1447
     * @see #valueOf(String, String, String)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1448
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1449
    public static ObjectName getInstance(String domain, String key,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1450
                                         String value)
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1451
            throws MalformedObjectNameException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1452
        return new ObjectName(domain, key, value);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1453
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1454
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1455
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1456
     * <p>Return an instance of ObjectName that can be used anywhere
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1457
     * an object obtained with {@link #ObjectName(String, Hashtable)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1458
     * new ObjectName(domain, table)} can be used.  The returned
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1459
     * object may be of a subclass of ObjectName.  Calling this method
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1460
     * twice with the same parameters may return the same object or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1461
     * two equal but not identical objects.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1462
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1463
     * @param domain  The domain part of the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1464
     * @param table A hash table containing one or more key
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1465
     * properties.  The key of each entry in the table is the key of a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1466
     * key property in the object name.  The associated value in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1467
     * table is the associated value in the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1468
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1469
     * @return an ObjectName corresponding to the given domain and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1470
     * key mappings.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1471
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1472
     * @exception MalformedObjectNameException The <code>domain</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1473
     * contains an illegal character, or one of the keys or values in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1474
     * <code>table</code> contains an illegal character, or one of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1475
     * values in <code>table</code> does not follow the rules for
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1476
     * quoting.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1477
     * @exception NullPointerException One of the parameters is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1478
     *
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1479
     * @see #valueOf(String, Hashtable)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1480
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1481
    public static ObjectName getInstance(String domain,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1482
                                         Hashtable<String,String> table)
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1483
        throws MalformedObjectNameException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1484
        return new ObjectName(domain, table);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1485
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1486
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1487
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1488
     * <p>Return an instance of ObjectName that can be used anywhere
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1489
     * the given object can be used.  The returned object may be of a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1490
     * subclass of ObjectName.  If <code>name</code> is of a subclass
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1491
     * of ObjectName, it is not guaranteed that the returned object
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1492
     * will be of the same class.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1493
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1494
     * <p>The returned value may or may not be identical to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1495
     * <code>name</code>.  Calling this method twice with the same
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1496
     * parameters may return the same object or two equal but not
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1497
     * identical objects.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1498
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1499
     * <p>Since ObjectName is immutable, it is not usually useful to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1500
     * make a copy of an ObjectName.  The principal use of this method
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1501
     * is to guard against a malicious caller who might pass an
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1502
     * instance of a subclass with surprising behavior to sensitive
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1503
     * code.  Such code can call this method to obtain an ObjectName
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1504
     * that is known not to have surprising behavior.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1505
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1506
     * @param name an instance of the ObjectName class or of a subclass
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1507
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1508
     * @return an instance of ObjectName or a subclass that is known to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1509
     * have the same semantics.  If <code>name</code> respects the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1510
     * semantics of ObjectName, then the returned object is equal
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1511
     * (though not necessarily identical) to <code>name</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1512
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1513
     * @exception NullPointerException The <code>name</code> is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1514
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1515
     */
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1516
    public static ObjectName getInstance(ObjectName name) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1517
        if (name.getClass().equals(ObjectName.class))
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1518
            return name;
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1519
        return valueOf(name.getSerializedNameString());
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1520
    }
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1521
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1522
    /**
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1523
     * <p>Return an instance of ObjectName that can be used anywhere
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1524
     * an object obtained with {@link #ObjectName(String) new
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1525
     * ObjectName(name)} can be used.  The returned object may be of
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1526
     * a subclass of ObjectName.  Calling this method twice with the
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1527
     * same parameters may return the same object or two equal but
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1528
     * not identical objects.</p>
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1529
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1530
     * <p>This method is equivalent to {@link #getInstance(String)} except that
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1531
     * it does not throw any checked exceptions.</p>
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1532
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1533
     * @param name  A string representation of the object name.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1534
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1535
     * @return an ObjectName corresponding to the given String.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1536
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1537
     * @exception IllegalArgumentException The string passed as a
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1538
     * parameter does not have the right format.  The {@linkplain
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1539
     * Throwable#getCause() cause} of this exception will be a
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1540
     * {@link MalformedObjectNameException}.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1541
     * @exception NullPointerException The <code>name</code> parameter
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1542
     * is null.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1543
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1544
     * @since 1.7
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1545
     */
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1546
    public static ObjectName valueOf(String name) {
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1547
        try {
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1548
            return getInstance(name);
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1549
        } catch (MalformedObjectNameException e) {
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1550
            throw new IllegalArgumentException(e.getMessage(), e);
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1551
            // Just plain IllegalArgumentException(e) produces an exception
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1552
            // message "javax.management.MalformedObjectNameException: ..."
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1553
            // which is distracting.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1554
        }
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1555
    }
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1556
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1557
    /**
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1558
     * <p>Return an instance of ObjectName that can be used anywhere
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1559
     * an object obtained with {@link #ObjectName(String, String,
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1560
     * String) new ObjectName(domain, key, value)} can be used.  The
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1561
     * returned object may be of a subclass of ObjectName.  Calling
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1562
     * this method twice with the same parameters may return the same
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1563
     * object or two equal but not identical objects.</p>
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1564
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1565
     * <p>This method is equivalent to {@link #getInstance(String, String,
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1566
     * String)} except that it does not throw any checked exceptions.</p>
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1567
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1568
     * @param domain  The domain part of the object name.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1569
     * @param key  The attribute in the key property of the object name.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1570
     * @param value The value in the key property of the object name.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1571
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1572
     * @return an ObjectName corresponding to the given domain,
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1573
     * key, and value.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1574
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1575
     * @exception IllegalArgumentException The
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1576
     * <code>domain</code>, <code>key</code>, or <code>value</code>
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1577
     * contains an illegal character, or <code>value</code> does not
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1578
     * follow the rules for quoting.  The {@linkplain
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1579
     * Throwable#getCause() cause} of this exception will be a
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1580
     * {@link MalformedObjectNameException}.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1581
     * @exception NullPointerException One of the parameters is null.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1582
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1583
     * @since 1.7
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1584
     */
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1585
    public static ObjectName valueOf(String domain, String key, String value) {
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1586
        try {
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1587
            return getInstance(domain, key, value);
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1588
        } catch (MalformedObjectNameException e) {
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1589
            throw new IllegalArgumentException(e.getMessage(), e);
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1590
        }
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1591
    }
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1592
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1593
    /**
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1594
     * <p>Return an instance of ObjectName that can be used anywhere
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1595
     * an object obtained with {@link #ObjectName(String, Hashtable)
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1596
     * new ObjectName(domain, table)} can be used.  The returned
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1597
     * object may be of a subclass of ObjectName.  Calling this method
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1598
     * twice with the same parameters may return the same object or
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1599
     * two equal but not identical objects.</p>
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1600
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1601
     * <p>This method is equivalent to {@link #getInstance(String, Hashtable)}
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1602
     * except that it does not throw any checked exceptions.</p>
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1603
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1604
     * @param domain  The domain part of the object name.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1605
     * @param table A hash table containing one or more key
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1606
     * properties.  The key of each entry in the table is the key of a
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1607
     * key property in the object name.  The associated value in the
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1608
     * table is the associated value in the object name.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1609
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1610
     * @return an ObjectName corresponding to the given domain and
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1611
     * key mappings.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1612
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1613
     * @exception IllegalArgumentException The <code>domain</code>
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1614
     * contains an illegal character, or one of the keys or values in
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1615
     * <code>table</code> contains an illegal character, or one of the
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1616
     * values in <code>table</code> does not follow the rules for
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1617
     * quoting.  The {@linkplain Throwable#getCause() cause} of this exception
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1618
     * will be a {@link MalformedObjectNameException}.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1619
     * @exception NullPointerException One of the parameters is null.
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1620
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1621
     * @since 1.7
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1622
     */
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1623
    public static ObjectName valueOf(String domain,
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1624
                                     Hashtable<String,String> table) {
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1625
        try {
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1626
            return new ObjectName(domain, table);
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1627
        } catch (MalformedObjectNameException e) {
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1628
            throw new IllegalArgumentException(e.getMessage(), e);
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1629
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1630
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1631
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1632
    /**
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1633
     * Returns an {@code ObjectName} that is the same as this one but
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1634
     * with the specified domain.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1635
     * This method preserves the original key order in the new instance.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1636
     * If the provided name has a key property pattern, it will also be
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1637
     * preserved in the returned instance.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1638
     *
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1639
     * @param newDomain The new domain for the returned instance;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1640
     *        must not be null.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1641
     * @return A new {@code ObjectName} that is the same as {@code this}
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1642
     *         except the domain is {@code newDomain}.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1643
     * @throws NullPointerException if {@code newDomain} is null.
1709
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1644
     * @exception IllegalArgumentException The {@code newDomain} passed as a
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1645
     * parameter does not have the right format.  The {@linkplain
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1646
     * Throwable#getCause() cause} of this exception will be a
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1647
     * {@link MalformedObjectNameException}.
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1648
     * @since 1.7
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1649
     **/
1709
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1650
    public final ObjectName withDomain(String newDomain) {
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1651
        try {
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1652
            return new ObjectName(newDomain, this);
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1653
        } catch (MalformedObjectNameException x) {
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1654
            throw new IllegalArgumentException(x.getMessage(),x);
392dd6db361a 6768935: Clarify the behaviour of ObjectName pattern matching with regards to namespaces
dfuchs
parents: 1225
diff changeset
  1655
        }
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1656
    }
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1657
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1658
    /**
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1659
     * Construct an object name from the given string.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1660
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1661
     * @param name  A string representation of the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1662
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1663
     * @exception MalformedObjectNameException The string passed as a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1664
     * parameter does not have the right format.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1665
     * @exception NullPointerException The <code>name</code> parameter
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1666
     * is null.
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1667
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1668
     * @see #valueOf(String)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1669
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1670
    public ObjectName(String name)
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1671
        throws MalformedObjectNameException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1672
        construct(name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1673
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1674
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1675
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1676
     * Construct an object name with exactly one key property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1677
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1678
     * @param domain  The domain part of the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1679
     * @param key  The attribute in the key property of the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1680
     * @param value The value in the key property of the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1681
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1682
     * @exception MalformedObjectNameException The
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1683
     * <code>domain</code>, <code>key</code>, or <code>value</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1684
     * contains an illegal character, or <code>value</code> does not
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1685
     * follow the rules for quoting.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1686
     * @exception NullPointerException One of the parameters is null.
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1687
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1688
     * @see #valueOf(String, String, String)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1689
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1690
    public ObjectName(String domain, String key, String value)
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1691
        throws MalformedObjectNameException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1692
        // If key or value are null a NullPointerException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1693
        // will be thrown by the put method in Hashtable.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1694
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1695
        Map<String,String> table = Collections.singletonMap(key, value);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1696
        construct(domain, table);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1697
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1698
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1699
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1700
     * Construct an object name with several key properties from a Hashtable.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1701
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1702
     * @param domain  The domain part of the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1703
     * @param table A hash table containing one or more key
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1704
     * properties.  The key of each entry in the table is the key of a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1705
     * key property in the object name.  The associated value in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1706
     * table is the associated value in the object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1707
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1708
     * @exception MalformedObjectNameException The <code>domain</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1709
     * contains an illegal character, or one of the keys or values in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1710
     * <code>table</code> contains an illegal character, or one of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1711
     * values in <code>table</code> does not follow the rules for
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1712
     * quoting.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1713
     * @exception NullPointerException One of the parameters is null.
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1714
     *
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1715
     * @see #valueOf(String, Hashtable)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1716
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1717
    public ObjectName(String domain, Hashtable<String,String> table)
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1718
            throws MalformedObjectNameException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1719
        construct(domain, table);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1720
        /* The exception for when a key or value in the table is not a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1721
           String is now ClassCastException rather than
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1722
           MalformedObjectNameException.  This was not previously
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1723
           specified.  */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1724
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1725
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1726
    // Category : ObjectName Construction <==============================
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1727
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1728
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1729
    // Category : Getter methods ------------------------------>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1730
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1731
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1732
     * Checks whether the object name is a pattern.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1733
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1734
     * An object name is a pattern if its domain contains a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1735
     * wildcard or if the object name is a property pattern.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1736
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1737
     * @return  True if the name is a pattern, otherwise false.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1738
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1739
    public boolean isPattern() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1740
        return (_domain_pattern ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1741
                _property_list_pattern ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1742
                _property_value_pattern);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1743
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1744
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1745
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1746
     * Checks whether the object name is a pattern on the domain part.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1747
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1748
     * @return  True if the name is a domain pattern, otherwise false.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1749
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1750
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1751
    public boolean isDomainPattern() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1752
        return _domain_pattern;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1753
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1754
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1755
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1756
     * Checks whether the object name is a pattern on the key properties.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1757
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1758
     * An object name is a pattern on the key properties if it is a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1759
     * pattern on the key property list (e.g. "d:k=v,*") or on the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1760
     * property values (e.g. "d:k=*") or on both (e.g. "d:k=*,*").
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1761
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1762
     * @return  True if the name is a property pattern, otherwise false.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1763
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1764
    public boolean isPropertyPattern() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1765
        return _property_list_pattern || _property_value_pattern;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1766
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1767
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1768
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1769
     * Checks whether the object name is a pattern on the key property list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1770
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1771
     * For example, "d:k=v,*" and "d:k=*,*" are key property list patterns
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1772
     * whereas "d:k=*" is not.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1773
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1774
     * @return  True if the name is a property list pattern, otherwise false.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1775
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1776
     * @since 1.6
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1777
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1778
    public boolean isPropertyListPattern() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1779
        return _property_list_pattern;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1780
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1781
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1782
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1783
     * Checks whether the object name is a pattern on the value part
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1784
     * of at least one of the key properties.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1785
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1786
     * For example, "d:k=*" and "d:k=*,*" are property value patterns
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1787
     * whereas "d:k=v,*" is not.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1788
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1789
     * @return  True if the name is a property value pattern, otherwise false.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1790
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1791
     * @since 1.6
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1792
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1793
    public boolean isPropertyValuePattern() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1794
        return _property_value_pattern;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1795
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1796
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1797
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1798
     * Checks whether the value associated with a key in a key
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1799
     * property is a pattern.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1800
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1801
     * @param property The property whose value is to be checked.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1802
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1803
     * @return True if the value associated with the given key property
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1804
     * is a pattern, otherwise false.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1805
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1806
     * @exception NullPointerException If <code>property</code> is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1807
     * @exception IllegalArgumentException If <code>property</code> is not
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1808
     * a valid key property for this ObjectName.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1809
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1810
     * @since 1.6
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1811
     */
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1812
    public boolean isPropertyValuePattern(String property) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1813
        if (property == null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1814
            throw new NullPointerException("key property can't be null");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1815
        for (int i = 0; i < _ca_array.length; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1816
            Property prop = _ca_array[i];
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1817
            String key = prop.getKeyString(_canonicalName,_domain_length);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1818
            if (key.equals(property))
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1819
                return (prop instanceof PatternProperty);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1820
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1821
        throw new IllegalArgumentException("key property not found");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1822
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1823
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1824
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1825
     * <p>Returns the canonical form of the name; that is, a string
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1826
     * representation where the properties are sorted in lexical
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1827
     * order.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1828
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1829
     * <p>More precisely, the canonical form of the name is a String
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1830
     * consisting of the <em>domain part</em>, a colon
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1831
     * (<code>:</code>), the <em>canonical key property list</em>, and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1832
     * a <em>pattern indication</em>.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1833
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1834
     * <p>The <em>canonical key property list</em> is the same string
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1835
     * as described for {@link #getCanonicalKeyPropertyListString()}.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1836
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1837
     * <p>The <em>pattern indication</em> is:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1838
     * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1839
     * <li>empty for an ObjectName
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1840
     * that is not a property list pattern;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1841
     * <li>an asterisk for an ObjectName
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1842
     * that is a property list pattern with no keys; or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1843
     * <li>a comma and an
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1844
     * asterisk (<code>,*</code>) for an ObjectName that is a property
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1845
     * list pattern with at least one key.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1846
     * </ul></p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1847
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1848
     * @return The canonical form of the name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1849
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1850
    public String getCanonicalName()  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1851
        return _canonicalName;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1852
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1853
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1854
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1855
     * Returns the domain part.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1856
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1857
     * @return The domain.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1858
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1859
    public String getDomain()  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1860
        return _canonicalName.substring(0, _domain_length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1861
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1862
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1863
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1864
     * Obtains the value associated with a key in a key property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1865
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1866
     * @param property The property whose value is to be obtained.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1867
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1868
     * @return The value of the property, or null if there is no such
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1869
     * property in this ObjectName.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1870
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1871
     * @exception NullPointerException If <code>property</code> is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1872
     */
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  1873
    public String getKeyProperty(String property) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1874
        return _getKeyPropertyList().get(property);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1875
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1876
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1877
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1878
     * <p>Returns the key properties as a Map.  The returned
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1879
     * value is a Map in which each key is a key in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1880
     * ObjectName's key property list and each value is the associated
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1881
     * value.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1882
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1883
     * <p>The returned value must not be modified.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1884
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1885
     * @return The table of key properties.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1886
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1887
    private Map<String,String> _getKeyPropertyList()  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1888
        synchronized (this) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1889
            if (_propertyList == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1890
                // build (lazy eval) the property list from the canonical
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1891
                // properties array
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1892
                _propertyList = new HashMap<String,String>();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1893
                int len = _ca_array.length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1894
                Property prop;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1895
                for (int i = len - 1; i >= 0; i--) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1896
                    prop = _ca_array[i];
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1897
                    _propertyList.put(prop.getKeyString(_canonicalName,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1898
                                            _domain_length),
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1899
                                      prop.getValueString(_canonicalName,
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1900
                                            _domain_length));
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1901
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1902
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1903
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1904
        return _propertyList;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1905
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1906
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1907
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1908
     * <p>Returns the key properties as a Hashtable.  The returned
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1909
     * value is a Hashtable in which each key is a key in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1910
     * ObjectName's key property list and each value is the associated
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1911
     * value.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1912
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1913
     * <p>The returned value may be unmodifiable.  If it is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1914
     * modifiable, changing it has no effect on this ObjectName.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1915
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1916
     * @return The table of key properties.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1917
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1918
    // CR 6441274 depends on the modification property defined above
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1919
    public Hashtable<String,String> getKeyPropertyList()  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1920
        return new Hashtable<String,String>(_getKeyPropertyList());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1921
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1922
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1923
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1924
     * <p>Returns a string representation of the list of key
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1925
     * properties specified at creation time.  If this ObjectName was
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1926
     * constructed with the constructor {@link #ObjectName(String)},
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1927
     * the key properties in the returned String will be in the same
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1928
     * order as in the argument to the constructor.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1929
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1930
     * @return The key property list string.  This string is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1931
     * independent of whether the ObjectName is a pattern.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1932
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1933
    public String getKeyPropertyListString()  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1934
        // BEWARE : we rebuild the propertyliststring at each call !!
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1935
        if (_kp_array.length == 0) return "";
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1936
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1937
        // the size of the string is the canonical one minus domain
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1938
        // part and pattern part
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1939
        final int total_size = _canonicalName.length() - _domain_length - 1
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1940
            - (_property_list_pattern?2:0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1941
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1942
        final char[] dest_chars = new char[total_size];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1943
        final char[] value = _canonicalName.toCharArray();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1944
        writeKeyPropertyListString(value,dest_chars,0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1945
        return new String(dest_chars);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1946
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1947
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1948
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1949
     * <p>Returns the serialized string of the ObjectName.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1950
     * properties specified at creation time.  If this ObjectName was
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1951
     * constructed with the constructor {@link #ObjectName(String)},
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1952
     * the key properties in the returned String will be in the same
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1953
     * order as in the argument to the constructor.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1954
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1955
     * @return The key property list string.  This string is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1956
     * independent of whether the ObjectName is a pattern.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1957
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1958
    private String getSerializedNameString()  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1959
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1960
        // the size of the string is the canonical one
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1961
        final int total_size = _canonicalName.length();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1962
        final char[] dest_chars = new char[total_size];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1963
        final char[] value = _canonicalName.toCharArray();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1964
        final int offset = _domain_length+1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1965
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1966
        // copy "domain:" into dest_chars
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1967
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1968
        System.arraycopy(value, 0, dest_chars, 0, offset);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1969
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1970
        // Add property list string
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1971
        final int end = writeKeyPropertyListString(value,dest_chars,offset);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1972
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1973
        // Add ",*" if necessary
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1974
        if (_property_list_pattern) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1975
            if (end == offset)  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1976
                // Property list string is empty.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1977
                dest_chars[end] = '*';
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1978
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1979
                // Property list string is not empty.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1980
                dest_chars[end]   = ',';
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1981
                dest_chars[end+1] = '*';
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1982
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1983
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1984
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1985
        final String name = new String(dest_chars);
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  1986
        return name;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1987
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1988
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1989
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1990
     * <p>Write a string representation of the list of key
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1991
     * properties specified at creation time in the given array, starting
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1992
     * at the specified offset.  If this ObjectName was
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1993
     * constructed with the constructor {@link #ObjectName(String)},
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1994
     * the key properties in the returned String will be in the same
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1995
     * order as in the argument to the constructor.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1996
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1997
     * @return offset + #of chars written
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1998
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1999
    private int writeKeyPropertyListString(char[] canonicalChars,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2000
                                           char[] data, int offset)  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2001
        if (_kp_array.length == 0) return offset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2002
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2003
        final char[] dest_chars = data;
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2004
        final char[] value = canonicalChars;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2005
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2006
        int index = offset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2007
        final int len = _kp_array.length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2008
        final int last = len - 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2009
        for (int i = 0; i < len; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2010
            final Property prop = _kp_array[i];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2011
            final int prop_len = prop._key_length + prop._value_length + 1;
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2012
            System.arraycopy(value, prop._key_index+_domain_length, dest_chars, index,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2013
                             prop_len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2014
            index += prop_len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2015
            if (i < last ) dest_chars[index++] = ',';
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2016
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2017
        return index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2018
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2019
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2020
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2021
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2022
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2023
     * Returns a string representation of the list of key properties,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2024
     * in which the key properties are sorted in lexical order. This
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2025
     * is used in lexicographic comparisons performed in order to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2026
     * select MBeans based on their key property list.  Lexical order
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2027
     * is the order implied by {@link String#compareTo(String)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2028
     * String.compareTo(String)}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2029
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2030
     * @return The canonical key property list string.  This string is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2031
     * independent of whether the ObjectName is a pattern.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2032
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2033
    public String getCanonicalKeyPropertyListString()  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2034
        if (_ca_array.length == 0) return "";
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2035
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2036
        int len = _canonicalName.length();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2037
        if (_property_list_pattern) len -= 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2038
        return _canonicalName.substring(_domain_length +1, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2039
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2040
    // Category : Getter methods <===================================
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2041
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2042
    // Category : Utilities ---------------------------------------->
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2043
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2044
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2045
     * <p>Returns a string representation of the object name.  The
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2046
     * format of this string is not specified, but users can expect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2047
     * that two ObjectNames return the same string if and only if they
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2048
     * are equal.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2049
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2050
     * @return a string representation of this object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2051
     */
34
2d042367885f 6602310: Extensions to Query API for JMX 2.0
emcmanus
parents: 2
diff changeset
  2052
    @Override
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2053
    public String toString()  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2054
        return getSerializedNameString();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2055
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2056
34
2d042367885f 6602310: Extensions to Query API for JMX 2.0
emcmanus
parents: 2
diff changeset
  2057
    String toQueryString() {
686
d0c74839e1bd 6701498: Change JMX query language to use * and ? as wildcards rather than % and _
emcmanus
parents: 526
diff changeset
  2058
        return "like " + Query.value(toString());
34
2d042367885f 6602310: Extensions to Query API for JMX 2.0
emcmanus
parents: 2
diff changeset
  2059
    }
2d042367885f 6602310: Extensions to Query API for JMX 2.0
emcmanus
parents: 2
diff changeset
  2060
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2061
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2062
     * Compares the current object name with another object name.  Two
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2063
     * ObjectName instances are equal if and only if their canonical
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2064
     * forms are equal.  The canonical form is the string described
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2065
     * for {@link #getCanonicalName()}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2066
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2067
     * @param object  The object name that the current object name is to be
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2068
     *        compared with.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2069
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2070
     * @return True if <code>object</code> is an ObjectName whose
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2071
     * canonical form is equal to that of this ObjectName.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2072
     */
1005
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  2073
    @Override
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2074
    public boolean equals(Object object)  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2075
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2076
        // same object case
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2077
        if (this == object) return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2078
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2079
        // object is not an object name case
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2080
        if (!(object instanceof ObjectName)) return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2081
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2082
        // equality when canonical names are the same
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2083
        // (because usage of intern())
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2084
        ObjectName on = (ObjectName) object;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2085
        String on_string = on._canonicalName;
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2086
        if (_canonicalName == on_string) return true;  // ES: OK
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2087
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2088
        // Because we are sharing canonical form between object names,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2089
        // we have finished the comparison at this stage ==> unequal
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2090
        return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2091
   }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2092
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2093
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2094
     * Returns a hash code for this object name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2095
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2096
     */
1005
1a39b4e3f2fc 6616825: JMX query returns no value in 1.0 compatibility mode - deserialization bug in readObject()
dfuchs
parents: 715
diff changeset
  2097
    @Override
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2098
    public int hashCode() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2099
        return _canonicalName.hashCode();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2100
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2101
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2102
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2103
     * <p>Returns a quoted form of the given String, suitable for
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2104
     * inclusion in an ObjectName.  The returned value can be used as
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2105
     * the value associated with a key in an ObjectName.  The String
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2106
     * <code>s</code> may contain any character.  Appropriate quoting
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2107
     * ensures that the returned value is legal in an ObjectName.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2108
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2109
     * <p>The returned value consists of a quote ('"'), a sequence of
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2110
     * characters corresponding to the characters of <code>s</code>,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2111
     * and another quote.  Characters in <code>s</code> appear
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2112
     * unchanged within the returned value except:</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2113
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2114
     * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2115
     * <li>A quote ('"') is replaced by a backslash (\) followed by a quote.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2116
     * <li>An asterisk ('*') is replaced by a backslash (\) followed by an
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2117
     * asterisk.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2118
     * <li>A question mark ('?') is replaced by a backslash (\) followed by
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2119
     * a question mark.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2120
     * <li>A backslash ('\') is replaced by two backslashes.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2121
     * <li>A newline character (the character '\n' in Java) is replaced
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2122
     * by a backslash followed by the character '\n'.</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2123
     * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2124
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2125
     * @param s the String to be quoted.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2126
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2127
     * @return the quoted String.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2128
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2129
     * @exception NullPointerException if <code>s</code> is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2130
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2131
     */
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  2132
    public static String quote(String s) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2133
        final StringBuilder buf = new StringBuilder("\"");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2134
        final int len = s.length();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2135
        for (int i = 0; i < len; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2136
            char c = s.charAt(i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2137
            switch (c) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2138
            case '\n':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2139
                c = 'n';
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2140
                buf.append('\\');
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2141
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2142
            case '\\':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2143
            case '\"':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2144
            case '*':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2145
            case '?':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2146
                buf.append('\\');
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2147
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2148
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2149
            buf.append(c);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2150
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2151
        buf.append('"');
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2152
        return buf.toString();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2153
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2154
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2155
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2156
     * <p>Returns an unquoted form of the given String.  If
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2157
     * <code>q</code> is a String returned by {@link #quote quote(s)},
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2158
     * then <code>unquote(q).equals(s)</code>.  If there is no String
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2159
     * <code>s</code> for which <code>quote(s).equals(q)</code>, then
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2160
     * unquote(q) throws an IllegalArgumentException.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2161
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2162
     * <p>These rules imply that there is a one-to-one mapping between
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2163
     * quoted and unquoted forms.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2164
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2165
     * @param q the String to be unquoted.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2166
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2167
     * @return the unquoted String.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2168
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2169
     * @exception IllegalArgumentException if <code>q</code> could not
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2170
     * have been returned by the {@link #quote} method, for instance
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2171
     * if it does not begin and end with a quote (").
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2172
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2173
     * @exception NullPointerException if <code>q</code> is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2174
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2175
     */
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  2176
    public static String unquote(String q) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2177
        final StringBuilder buf = new StringBuilder();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2178
        final int len = q.length();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2179
        if (len < 2 || q.charAt(0) != '"' || q.charAt(len - 1) != '"')
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2180
            throw new IllegalArgumentException("Argument not quoted");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2181
        for (int i = 1; i < len - 1; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2182
            char c = q.charAt(i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2183
            if (c == '\\') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2184
                if (i == len - 2)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2185
                    throw new IllegalArgumentException("Trailing backslash");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2186
                c = q.charAt(++i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2187
                switch (c) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2188
                case 'n':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2189
                    c = '\n';
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2190
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2191
                case '\\':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2192
                case '\"':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2193
                case '*':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2194
                case '?':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2195
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2196
                default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2197
                  throw new IllegalArgumentException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2198
                                   "Bad character '" + c + "' after backslash");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2199
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2200
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2201
                switch (c) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2202
                    case '*' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2203
                    case '?' :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2204
                    case '\"':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2205
                    case '\n':
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2206
                         throw new IllegalArgumentException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2207
                                          "Invalid unescaped character '" + c +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2208
                                          "' in the string to unquote");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2209
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2210
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2211
            buf.append(c);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2212
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2213
        return buf.toString();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2214
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2215
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2216
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2217
     * Defines the wildcard "*:*" ObjectName.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2218
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2219
     * @since 1.6
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2220
     */
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  2221
    public static final ObjectName WILDCARD = valueOf("*:*");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2222
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2223
    // Category : Utilities <===================================
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2224
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2225
    // Category : QueryExp Interface ---------------------------------------->
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2226
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2227
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2228
     * <p>Test whether this ObjectName, which may be a pattern,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2229
     * matches another ObjectName.  If <code>name</code> is a pattern,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2230
     * the result is false.  If this ObjectName is a pattern, the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2231
     * result is true if and only if <code>name</code> matches the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2232
     * pattern.  If neither this ObjectName nor <code>name</code> is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2233
     * a pattern, the result is true if and only if the two
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2234
     * ObjectNames are equal as described for the {@link
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2235
     * #equals(Object)} method.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2236
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2237
     * @param name The name of the MBean to compare to.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2238
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2239
     * @return True if <code>name</code> matches this ObjectName.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2240
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2241
     * @exception NullPointerException if <code>name</code> is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2242
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2243
     */
1225
6ef6227d36eb 6734813: Provide a way to construct an ObjectName without checked exceptions
emcmanus
parents: 1156
diff changeset
  2244
    public boolean apply(ObjectName name) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2245
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2246
        if (name == null) throw new NullPointerException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2247
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2248
        if (name._domain_pattern ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2249
            name._property_list_pattern ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2250
            name._property_value_pattern)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2251
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2252
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2253
        // No pattern
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2254
        if (!_domain_pattern &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2255
            !_property_list_pattern &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2256
            !_property_value_pattern)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2257
            return _canonicalName.equals(name._canonicalName);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2258
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2259
        return matchDomains(name) && matchKeys(name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2260
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2261
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2262
    private final boolean matchDomains(ObjectName name) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2263
        if (_domain_pattern) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2264
            // wildmatch domains
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2265
            // This ObjectName is the pattern
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2266
            // The other ObjectName is the string.
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2267
            return Util.wildpathmatch(name.getDomain(),getDomain());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2268
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2269
        return getDomain().equals(name.getDomain());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2270
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2271
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2272
    private final boolean matchKeys(ObjectName name) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2273
        // If key property value pattern but not key property list
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2274
        // pattern, then the number of key properties must be equal
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2275
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2276
        if (_property_value_pattern &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2277
            !_property_list_pattern &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2278
            (name._ca_array.length != _ca_array.length))
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2279
                return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2280
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2281
        // If key property value pattern or key property list pattern,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2282
        // then every property inside pattern should exist in name
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2283
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2284
        if (_property_value_pattern || _property_list_pattern) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2285
            final Map<String,String> nameProps = name._getKeyPropertyList();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2286
            final Property[] props = _ca_array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2287
            final String cn = _canonicalName;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2288
            for (int i = props.length - 1; i >= 0 ; i--) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2289
                // Find value in given object name for key at current
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2290
                // index in receiver
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2291
                //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2292
                final Property p = props[i];
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2293
                final String   k = p.getKeyString(cn,_domain_length);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2294
                final String   v = nameProps.get(k);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2295
                // Did we find a value for this key ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2296
                //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2297
                if (v == null) return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2298
                // If this property is ok (same key, same value), go to next
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2299
                //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2300
                if (_property_value_pattern && (p instanceof PatternProperty)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2301
                    // wildmatch key property values
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2302
                    // p is the property pattern, v is the string
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2303
                    if (Util.wildmatch(v,p.getValueString(cn,_domain_length)))
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2304
                        continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2305
                    else
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2306
                        return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2307
                }
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2308
                if (v.equals(p.getValueString(cn,_domain_length))) continue;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2309
                return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2310
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2311
            return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2312
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2313
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2314
        // If no pattern, then canonical names must be equal
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2315
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2316
        final String p1 = name.getCanonicalKeyPropertyListString();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2317
        final String p2 = getCanonicalKeyPropertyListString();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2318
        return (p1.equals(p2));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2319
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2320
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2321
    /* Method inherited from QueryExp, no implementation needed here
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2322
       because ObjectName is not relative to an MBeanServer and does
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2323
       not contain a subquery.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2324
    */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2325
    public void setMBeanServer(MBeanServer mbs) { }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2326
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2327
    // Category : QueryExp Interface <=========================
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2328
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2329
    // Category : Comparable Interface ---------------------------------------->
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2330
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2331
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2332
     * <p>Compares two ObjectName instances. The ordering relation between
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2333
     * ObjectNames is not completely specified but is intended to be such
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2334
     * that a sorted list of ObjectNames will appear in an order that is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2335
     * convenient for a person to read.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2336
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2337
     * <p>In particular, if the two ObjectName instances have different
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2338
     * domains then their order is the lexicographical order of the domains.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2339
     * The ordering of the key property list remains unspecified.</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2340
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2341
     * <p>For example, the ObjectName instances below:</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2342
     * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2343
     * <li>Shapes:type=Square,name=3</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2344
     * <li>Colors:type=Red,name=2</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2345
     * <li>Shapes:type=Triangle,side=isosceles,name=2</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2346
     * <li>Colors:type=Red,name=1</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2347
     * <li>Shapes:type=Square,name=1</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2348
     * <li>Colors:type=Blue,name=1</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2349
     * <li>Shapes:type=Square,name=2</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2350
     * <li>JMImplementation:type=MBeanServerDelegate</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2351
     * <li>Shapes:type=Triangle,side=scalene,name=1</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2352
     * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2353
     * <p>could be ordered as follows:</p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2354
     * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2355
     * <li>Colors:type=Blue,name=1</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2356
     * <li>Colors:type=Red,name=1</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2357
     * <li>Colors:type=Red,name=2</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2358
     * <li>JMImplementation:type=MBeanServerDelegate</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2359
     * <li>Shapes:type=Square,name=1</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2360
     * <li>Shapes:type=Square,name=2</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2361
     * <li>Shapes:type=Square,name=3</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2362
     * <li>Shapes:type=Triangle,side=scalene,name=1</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2363
     * <li>Shapes:type=Triangle,side=isosceles,name=2</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2364
     * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2365
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2366
     * @param name the ObjectName to be compared.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2367
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2368
     * @return a negative integer, zero, or a positive integer as this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2369
     *         ObjectName is less than, equal to, or greater than the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2370
     *         specified ObjectName.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2371
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2372
     * @since 1.6
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2373
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2374
    public int compareTo(ObjectName name) {
1156
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2375
        // Quick optimization:
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2376
        //
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2377
        if (name == this) return 0;
bbc2d15aaf7a 5072476: RFE: support cascaded (federated) MBean Servers
dfuchs
parents: 1005
diff changeset
  2378
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2379
        // (1) Compare domains
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2380
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2381
        int domainValue = this.getDomain().compareTo(name.getDomain());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2382
        if (domainValue != 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2383
            return domainValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2384
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2385
        // (2) Compare "type=" keys
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2386
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2387
        // Within a given domain, all names with missing or empty "type="
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2388
        // come before all names with non-empty type.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2389
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2390
        // When both types are missing or empty, canonical-name ordering
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2391
        // applies which is a total order.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2392
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2393
        String thisTypeKey = this.getKeyProperty("type");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2394
        String anotherTypeKey = name.getKeyProperty("type");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2395
        if (thisTypeKey == null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2396
            thisTypeKey = "";
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2397
        if (anotherTypeKey == null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2398
            anotherTypeKey = "";
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2399
        int typeKeyValue = thisTypeKey.compareTo(anotherTypeKey);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2400
        if (typeKeyValue != 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2401
            return typeKeyValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2402
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2403
        // (3) Compare canonical names
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2404
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2405
        return this.getCanonicalName().compareTo(name.getCanonicalName());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2406
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2407
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2408
    // Category : Comparable Interface <=========================
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2409
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2410
    // Public methods <========================================
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2411
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2412
}