package jdepend.metadata.util; import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.ExecutorService; import jdepend.framework.util.StringUtil; import jdepend.framework.util.ThreadPool; import jdepend.metadata.JavaClass; import jdepend.metadata.JavaClassRelationItem; import jdepend.metadata.JavaPackage; import jdepend.metadata.Method; import jdepend.metadata.relationtype.ParamRelation; public class JavaClassUtil { public static Collection<JavaClass> getClassesForJavaPackages(Collection<JavaPackage> javaPackages) { Collection<JavaClass> javaClasses = new ArrayList<JavaClass>(); for (JavaPackage javaPackage : javaPackages) { javaClasses.addAll(javaPackage.getClasses()); } return javaClasses; } public static ClassTypeInfo getType(JavaClass javaClass) { String type; boolean ensure_VO_TYPE; String path; type = JavaClass.Unensure_TYPE; ensure_VO_TYPE = false; path = ""; if (javaClass.isInner()) { if (!javaClass.isState()) { if (javaClass.getMethods().size() == 1 && javaClass.getMethods().iterator().next().isConstruction()) { type = JavaClass.VO_TYPE; path = "1"; ensure_VO_TYPE = true; } if (type.equals(JavaClass.Unensure_TYPE)) { L1: for (JavaClass subClass : javaClass.getSubClasses()) { if (subClass.isState()) { type = JavaClass.VO_TYPE; path = "2"; break L1; } } } if (type.equals(JavaClass.Unensure_TYPE)) { L2: for (JavaClass superClass : javaClass.getSupers()) { if (superClass.isState()) { type = JavaClass.VO_TYPE; path = "3"; break L2; } } } if (type.equals(JavaClass.Unensure_TYPE)) { type = JavaClass.Service_TYPE; path = "4"; } } else { type = JavaClass.VO_TYPE; path = "5"; } if (type.equals(JavaClass.VO_TYPE) && !ensure_VO_TYPE) { if (!javaClass.haveBusinessMethod()) { type = JavaClass.VO_TYPE; path += "6"; ensure_VO_TYPE = true; } if (!ensure_VO_TYPE) { L1: for (JavaClass superClass : javaClass.getSupers()) { if (superClass.isState()) { type = JavaClass.VO_TYPE; path += "7"; ensure_VO_TYPE = true; break L1; } } } if (!ensure_VO_TYPE) { boolean isParamRelation = false; M: for (JavaClassRelationItem item : javaClass.getCaItems()) { if (item.getType() instanceof ParamRelation) { isParamRelation = true; break M; } } if (!isParamRelation) { type = JavaClass.Service_TYPE; path += "9"; } else { type = JavaClass.VO_TYPE; path += "a"; ensure_VO_TYPE = true; } } } } return new ClassTypeInfo(type, path); } public static void supplyJavaClassRelationItem(final JavaClassCollection javaClasses) { ExecutorService pool = ThreadPool.getPool(); for (final String unit : javaClasses.getUnitJavaClasses().keySet()) { pool.execute(new Runnable() { @Override public void run() { for (JavaClass javaClass : javaClasses.getUnitJavaClasses().get(unit)) { javaClass.supplyJavaClassRelationItem(javaClasses); } } }); } ThreadPool.awaitTermination(pool); } /** * 将JavaClassDetail中的字符串信息填充为对象引用 * * @param javaClasses */ public static void supplyJavaClassDetail(final JavaClassCollection javaClasses) { supplyJavaClassDetailSimple(javaClasses); supplyJavaClassDetailMethodInvoke(javaClasses); } /** * 匹配JavaClass * * @param pattern * @param javaClass * @return */ public static boolean match(String pattern, JavaClass javaClass) { return match(pattern, javaClass.getName()); } /** * 匹配JavaClass * * @param pattern * @param className * @return */ public static boolean match(String pattern, String className) { String newPattern = null; if (!pattern.endsWith("*")) { newPattern = pattern + "*"; } else { newPattern = pattern; } boolean rtn = StringUtil.match(newPattern.toUpperCase(), className.substring(className.lastIndexOf('.') + 1) .toUpperCase()); if (rtn) { return true; } else { return StringUtil.match(pattern.toUpperCase(), className.substring(className.lastIndexOf('.') + 1) .toUpperCase()); } } /** * 将JavaClassDetail中的字符串信息填充为对象引用 * * @param javaClasses */ private static void supplyJavaClassDetailSimple(final JavaClassCollection javaClasses) { ExecutorService pool = ThreadPool.getPool(); for (final String unit : javaClasses.getUnitJavaClasses().keySet()) { pool.execute(new Runnable() { @Override public void run() { for (JavaClass javaClass : javaClasses.getUnitJavaClasses().get(unit)) { javaClass.supplyDetail(javaClasses); } } }); } ThreadPool.awaitTermination(pool); } /** * 将Method.InvokeItem中的字符串信息填充为对象引用 * * @param javaClasses */ private static void supplyJavaClassDetailMethodInvoke(final JavaClassCollection javaClasses) { ExecutorService pool = ThreadPool.getPool(); for (final String unit : javaClasses.getUnitJavaClasses().keySet()) { pool.execute(new Runnable() { @Override public void run() { for (JavaClass javaClass : javaClasses.getUnitJavaClasses().get(unit)) { // 填充Method中的InvokeItem for (Method method : javaClass.getSelfMethods()) { method.supplyInvokeItem(javaClasses); } } } }); } ThreadPool.awaitTermination(pool); } public static void main(String[] args) { String pattern = "*controller"; String className = "com.neusoft.saca.snap.portal.comment.CommentController"; System.out.print(JavaClassUtil.match(pattern, className)); } }