package jdepend.knowledge.pattern.impl1; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import jdepend.knowledge.pattern.PatternInfo; import jdepend.metadata.InvokeItem; import jdepend.metadata.JavaClass; import jdepend.metadata.Method; import jdepend.model.JavaClassUnit; public final class AdapterClassIdentifyer extends AbstractPatternIdentifyer { @Override public Collection<PatternInfo> identify(Collection<JavaClassUnit> javaClasses) { Collection<PatternInfo> rtn = new ArrayList<PatternInfo>(); Collection<JavaClass> interfaces; Collection<JavaClass> supers; JavaClass theInterfaceClass; JavaClass theSuperClass; for (JavaClassUnit javaClass : javaClasses) { // 收集接口和抽象类 interfaces = new HashSet<JavaClass>(); supers = new HashSet<JavaClass>(); for (JavaClass superClass : javaClass.getJavaClass().getSupers()) { if (superClass.isInterface()) { interfaces.add(superClass); } else { supers.add(superClass); } } if (interfaces.size() > 0 && supers.size() > 0) { for (Method method : javaClass.getJavaClass().getOverrideMethods()) { for (Method overrideMethod : javaClass.getJavaClass().getOverridedMethods(method)) { theInterfaceClass = overrideMethod.getJavaClass(); if (interfaces.contains(theInterfaceClass)) { for (InvokeItem item : method.getInvokeItems()) { theSuperClass = item.getCallee().getJavaClass(); if (supers.contains(theSuperClass)) { if (!theSuperClass.getSupers().contains(theInterfaceClass)) { rtn.add(new PatternInfo(javaClass.getJavaClass(), javaClass.getName() + "." + method.getName())); } } } } } } } } return rtn; } @Override public String getExplain() { StringBuilder explain = new StringBuilder(); explain.append("    <strong>适配器Class模式</strong><br>"); explain.append("    1、存在父类,并实现了接口;2、在实现的接口方法中调用了继承的父类方法;3、父类与接口没有实现关系<br><br>"); return explain.toString(); } }