package knorxx.framework.generator.util;
import com.google.common.base.CharMatcher;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
*
* @author sj
*/
public class JavaIdentifierUtils {
public static String getJavaClassSimpleName(String javaClassName) {
List<String> classNameParts = Splitter.on(".").splitToList(javaClassName);
String simpleClassName = classNameParts.get(classNameParts.size() - 1);
return simpleClassName;
}
public static boolean isInnerClass(String javaClassName) {
return javaClassName.contains("$") && !javaClassName.endsWith("$");
}
public static boolean isValidClassName(String className) {
if (!className.contains(".")) {
return className.matches("[A-Z][A-Za-z\\$]+");
} else {
String packageName = getPackageName(className);
return isValidClassName(className.substring(packageName.length() + 1, className.length()));
}
}
public static int getJavaClassNestingLevel(String javaClassName) {
return CharMatcher.anyOf("$").countIn(javaClassName);
}
public static boolean isValidConstantName(String fieldName) {
return fieldName.matches("[A-Z][A-Z_]+");
}
public static String getPackageName(String javaClassName) {
List<String> classNameParts = new ArrayList<>(Splitter.on(".").splitToList(javaClassName));
classNameParts.remove(classNameParts.size() - 1);
return Joiner.on(".").join(classNameParts);
}
public static boolean isJavaCoreClass(String javaClassName) {
return javaClassName.startsWith("java.") || javaClassName.startsWith("javax.");
}
public static boolean hasSuperclassOrImplementsInterface(Class<?> javaClass, String superJavaClassOrInterfaceName) {
while (javaClass != null) {
if (javaClass.getName().equals(superJavaClassOrInterfaceName)) {
return true;
}
for (Class javaInterface : javaClass.getInterfaces()) {
if (javaInterface.getName().equals(superJavaClassOrInterfaceName)) {
return true;
}
}
javaClass = javaClass.getSuperclass();
}
return false;
}
public static Set<String> removeInnerClassesAndInvalidClassNames(Set<String> javaClassNames) {
return new HashSet<>(Sets.filter(javaClassNames, new Predicate<String>() {
@Override
public boolean apply(String javaClassName) {
return !isInnerClass(javaClassName) && isValidClassName(javaClassName);
}
}));
}
public static Set<String> javaClassNamesToPackages(Set<String> javaClassNames) {
return new HashSet<>(Lists.transform(new ArrayList<>(javaClassNames), new Function<String, String>() {
@Override
public String apply(String javaClassName) {
return getPackageName(javaClassName);
}
}));
}
public static Set<String> removeJavaCoreClassNames(Set<String> javaClassNames) {
return new HashSet<>(Sets.filter(javaClassNames, new Predicate<String>() {
@Override
public boolean apply(String javaClassName) {
return !isJavaCoreClass(javaClassName);
}
}));
}
}