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