/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.uberfire.debug;
/**
* Utility methods that help with debugging.
*/
public class Debug {
/**
* The code requires this list to have 16 entries
*/
private static final String[] CONSONANTS = {"b", "d", "f", "h",
"j", "k", "l", "m",
"n", "p", "r", "s",
"t", "v", "w", "z"};
/**
* The code requires this list to have 8 entries
*/
private static final String[] VOWELS = {"a", "e", "ee", "i",
"o", "oo", "u", "y"};
/**
* Makes a reasonably easy-to-pronounce gibberish word from the given number. On average, the word will have about
* as many characters as the number would have when printed as a decimal, but (especially for large numbers) it will
* be easier to remember as a single word.
* @param num The number to convert.
* @return The memorable string, unique to the given number. Never null.
*/
public static String toMemorableString(long num) {
StringBuilder memorable = new StringBuilder();
for (; ; ) {
int chunk = (int) (num & 0xf);
memorable.append(CONSONANTS[chunk]);
num >>= 4;
if (num == 0) {
break;
}
chunk = (int) (num & 7);
memorable.append(VOWELS[chunk]);
num >>= 3;
if (num == 0) {
break;
}
}
return memorable.toString();
}
/**
* Composes a compact, memorable unique string for the given object instance. The name starts with the abbreviated
* fully-qualified class name (see {@link #abbreviatedName(Class)}), an '@' character, then a gibberish word
* representing the object's identity hash code (see {@link #toMemorableString(long)}).
* @param o
* @return
*/
public static String objectId(Object o) {
if (o == null) {
return null;
}
return abbreviatedName(o.getClass()) + "@" + toMemorableString(System.identityHashCode(o));
}
/**
* Returns a compact representation of the fully-qualified name of the given class. The string is built with the following components:
* <ol>
* <li>the first letter of each component of the package name
* <li>a dot
* <li>the class name. If the class is an inner class, the name is of the form Outer$Inner
* <ol>
* <p>
* For classes in the default package, items 1 and 2 are omitted.
* @param c the class whose name to abbreviate. Can be null, but will result in a null return value.
* @return the abbreviated FQCN as described, or null if the input is null.
*/
public static String abbreviatedName(Class<?> c) {
if (c == null) {
return null;
}
StringBuilder result = new StringBuilder();
String fqcn = c.getName();
int lastDot = -1;
int thisDot = -1;
while ((thisDot = fqcn.indexOf('.',
thisDot + 1)) != -1) {
result.append(fqcn.charAt(lastDot + 1));
lastDot = thisDot;
}
if (lastDot != -1) {
result.append('.');
}
result.append(fqcn.substring(lastDot + 1));
return result.toString();
}
/**
* Returns the short name of the given class (no package name). This is the same as java.lang.Class.shortName(),
* which is not implemented in the GWT version of java.lang.Class.
* @param c the class whose name to abbreviate. Can be null, but will result in a null return value.
* @return the abbreviated FQCN as described, or null if the input is null.
*/
public static String shortName(Class<?> c) {
if (c == null) {
return null;
}
return c.getName().substring(c.getName().lastIndexOf('.') + 1);
}
}