You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
7.9 KiB
242 lines
7.9 KiB
/*
|
|
* Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
|
|
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
|
|
package com.sun.jmx.mbeanserver;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.Collection;
|
|
import java.util.Collections;
|
|
import java.util.Comparator;
|
|
import java.util.HashMap;
|
|
import java.util.HashSet;
|
|
import java.util.IdentityHashMap;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import java.util.SortedMap;
|
|
import java.util.TreeMap;
|
|
import javax.management.MalformedObjectNameException;
|
|
import javax.management.ObjectName;
|
|
|
|
public class Util {
|
|
public static ObjectName newObjectName(String string) {
|
|
try {
|
|
return new ObjectName(string);
|
|
} catch (MalformedObjectNameException e) {
|
|
throw new IllegalArgumentException(e);
|
|
}
|
|
}
|
|
|
|
static <K, V> Map<K, V> newMap() {
|
|
return new HashMap<K, V>();
|
|
}
|
|
|
|
static <K, V> Map<K, V> newSynchronizedMap() {
|
|
return Collections.synchronizedMap(Util.<K, V>newMap());
|
|
}
|
|
|
|
static <K, V> IdentityHashMap<K, V> newIdentityHashMap() {
|
|
return new IdentityHashMap<K, V>();
|
|
}
|
|
|
|
static <K, V> Map<K, V> newSynchronizedIdentityHashMap() {
|
|
Map<K, V> map = newIdentityHashMap();
|
|
return Collections.synchronizedMap(map);
|
|
}
|
|
|
|
static <K, V> SortedMap<K, V> newSortedMap() {
|
|
return new TreeMap<K, V>();
|
|
}
|
|
|
|
static <K, V> SortedMap<K, V> newSortedMap(Comparator<? super K> comp) {
|
|
return new TreeMap<K, V>(comp);
|
|
}
|
|
|
|
static <K, V> Map<K, V> newInsertionOrderMap() {
|
|
return new LinkedHashMap<K, V>();
|
|
}
|
|
|
|
static <E> Set<E> newSet() {
|
|
return new HashSet<E>();
|
|
}
|
|
|
|
static <E> Set<E> newSet(Collection<E> c) {
|
|
return new HashSet<E>(c);
|
|
}
|
|
|
|
static <E> List<E> newList() {
|
|
return new ArrayList<E>();
|
|
}
|
|
|
|
static <E> List<E> newList(Collection<E> c) {
|
|
return new ArrayList<E>(c);
|
|
}
|
|
|
|
/* This method can be used by code that is deliberately violating the
|
|
* allowed checked casts. Rather than marking the whole method containing
|
|
* the code with @SuppressWarnings, you can use a call to this method for
|
|
* the exact place where you need to escape the constraints. Typically
|
|
* you will "import static" this method and then write either
|
|
* X x = cast(y);
|
|
* or, if that doesn't work (e.g. X is a type variable)
|
|
* Util.<X>cast(y);
|
|
*/
|
|
@SuppressWarnings("unchecked")
|
|
public static <T> T cast(Object x) {
|
|
return (T) x;
|
|
}
|
|
|
|
/**
|
|
* Computes a descriptor hashcode from its names and values.
|
|
* @param names the sorted array of descriptor names.
|
|
* @param values the array of descriptor values.
|
|
* @return a hash code value, as described in {@link #hashCode(Descriptor)}
|
|
*/
|
|
public static int hashCode(String[] names, Object[] values) {
|
|
int hash = 0;
|
|
for (int i = 0; i < names.length; i++) {
|
|
Object v = values[i];
|
|
int h;
|
|
if (v == null) {
|
|
h = 0;
|
|
} else if (v instanceof Object[]) {
|
|
h = Arrays.deepHashCode((Object[]) v);
|
|
} else if (v.getClass().isArray()) {
|
|
h = Arrays.deepHashCode(new Object[]{v}) - 31;
|
|
// hashcode of a list containing just v is
|
|
// v.hashCode() + 31, see List.hashCode()
|
|
} else {
|
|
h = v.hashCode();
|
|
}
|
|
hash += names[i].toLowerCase().hashCode() ^ h;
|
|
}
|
|
return hash;
|
|
}
|
|
|
|
/** Match a part of a string against a shell-style pattern.
|
|
The only pattern characters recognized are <code>?</code>,
|
|
standing for any one character,
|
|
and <code>*</code>, standing for any string of
|
|
characters, including the empty string. For instance,
|
|
{@code wildmatch("sandwich","sa?d*ch",1,4,1,4)} will match
|
|
{@code "and"} against {@code "a?d"}.
|
|
|
|
@param str the string containing the sequence to match.
|
|
@param pat a string containing a pattern to match the sub string
|
|
against.
|
|
@param stri the index in the string at which matching should begin.
|
|
@param strend the index in the string at which the matching should
|
|
end.
|
|
@param pati the index in the pattern at which matching should begin.
|
|
@param patend the index in the pattern at which the matching should
|
|
end.
|
|
|
|
@return true if and only if the string matches the pattern.
|
|
*/
|
|
/* The algorithm is a classical one. We advance pointers in
|
|
parallel through str and pat. If we encounter a star in pat,
|
|
we remember its position and continue advancing. If at any
|
|
stage we get a mismatch between str and pat, we look to see if
|
|
there is a remembered star. If not, we fail. If so, we
|
|
retreat pat to just past that star and str to the position
|
|
after the last one we tried, and we let the match advance
|
|
again.
|
|
|
|
Even though there is only one remembered star position, the
|
|
algorithm works when there are several stars in the pattern.
|
|
When we encounter the second star, we forget the first one.
|
|
This is OK, because if we get to the second star in A*B*C
|
|
(where A etc are arbitrary strings), we have already seen AXB.
|
|
We're therefore setting up a match of *C against the remainder
|
|
of the string, which will match if that remainder looks like
|
|
YC, so the whole string looks like AXBYC.
|
|
*/
|
|
private static boolean wildmatch(final String str, final String pat,
|
|
int stri, final int strend, int pati, final int patend) {
|
|
|
|
// System.out.println("matching "+pat.substring(pati,patend)+
|
|
// " against "+str.substring(stri, strend));
|
|
int starstri; // index for backtrack if "*" attempt fails
|
|
int starpati; // index for backtrack if "*" attempt fails, +1
|
|
|
|
starstri = starpati = -1;
|
|
|
|
/* On each pass through this loop, we either advance pati,
|
|
or we backtrack pati and advance starstri. Since starstri
|
|
is only ever assigned from pati, the loop must terminate. */
|
|
while (true) {
|
|
if (pati < patend) {
|
|
final char patc = pat.charAt(pati);
|
|
switch (patc) {
|
|
case '?':
|
|
if (stri == strend)
|
|
break;
|
|
stri++;
|
|
pati++;
|
|
continue;
|
|
case '*':
|
|
pati++;
|
|
starpati = pati;
|
|
starstri = stri;
|
|
continue;
|
|
default:
|
|
if (stri < strend && str.charAt(stri) == patc) {
|
|
stri++;
|
|
pati++;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
} else if (stri == strend)
|
|
return true;
|
|
|
|
// Mismatched, can we backtrack to a "*"?
|
|
if (starpati < 0 || starstri == strend)
|
|
return false;
|
|
|
|
// Retry the match one position later in str
|
|
pati = starpati;
|
|
starstri++;
|
|
stri = starstri;
|
|
}
|
|
}
|
|
|
|
/** Match a string against a shell-style pattern. The only pattern
|
|
characters recognized are <code>?</code>, standing for any one
|
|
character, and <code>*</code>, standing for any string of
|
|
characters, including the empty string.
|
|
|
|
@param str the string to match.
|
|
@param pat the pattern to match the string against.
|
|
|
|
@return true if and only if the string matches the pattern.
|
|
*/
|
|
public static boolean wildmatch(String str, String pat) {
|
|
return wildmatch(str,pat,0,str.length(),0,pat.length());
|
|
}
|
|
}
|