diff --git a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/API2ComponentAPI.java b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/API2ComponentAPI.java index ff6b4b6939d59cb5e6d589e288fd65be647ebfae..a842646f9cda8eed3c8d1397ff471ce28e15a883 100644 --- a/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/API2ComponentAPI.java +++ b/archive/releng.builder/tools/apitools/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/API2ComponentAPI.java @@ -151,26 +151,62 @@ public class API2ComponentAPI implements IClassVisitor public List getImplClasses(String interfaceName) { List list = new ArrayList(); + getImplClasses(interfaceName, list); + return list; + } + + private void getImplClasses(String interfaceName, List list) + { List implClasses = (List)interface2ImplClasses.get(interfaceName); if (implClasses != null) { list.addAll(implClasses); for (Iterator it = implClasses.iterator(); it.hasNext();) - getSubClasses((String)it.next(), list); + { + String className = (String)it.next(); + if (interface2ImplClasses.get(className) != null) + getImplClasses(className, list); + else + { + getSubClasses(className, list); + getSuperClasses(className, list); + } + } } - return list; } - private void getSubClasses(String superClassName, List list) + private void getSuperClasses(String className, List list) { - List subClasses = (List)super2SubClasses.get(superClassName); - if (subClasses != null) + ClassHierarchyInfo info = (ClassHierarchyInfo)super2SubClasses.get(className); + if (info != null) { - list.addAll(subClasses); - for (Iterator it = subClasses.iterator(); it.hasNext();) - getSubClasses((String)it.next(), list); + String superClassName = info.getSuperClass(); + while (superClassName != null) + { + list.add(superClassName); + superClassName = null; + info = (ClassHierarchyInfo)super2SubClasses.get(superClassName); + if (info != null) + superClassName = info.getSuperClass(); + } + } + } + + private void getSubClasses(String className, List list) + { + ClassHierarchyInfo info = (ClassHierarchyInfo)super2SubClasses.get(className); + if (info != null) + { + List subClasses = info.getSubClass(); + if (subClasses != null) + { + list.addAll(subClasses); + for (Iterator it = subClasses.iterator(); it.hasNext();) + getSubClasses((String)it.next(), list); + } } } + private Map pluginId2CompXML = new HashMap(); public void execute() @@ -259,27 +295,27 @@ public class API2ComponentAPI implements IClassVisitor if (readInterface) { String superClassName = new String(reader.getSuperclassName()).replace('/', '.'); - List subClasses = (List)super2SubClasses.get(superClassName); - if (subClasses == null) + ClassHierarchyInfo info = new ClassHierarchyInfo(); + info.setSuperClass(superClassName); + super2SubClasses.put(className, info); + info = (ClassHierarchyInfo)super2SubClasses.get(superClassName); + if (info == null) { - subClasses = new ArrayList(1); - super2SubClasses.put(superClassName, subClasses); + info = new ClassHierarchyInfo(); + super2SubClasses.put(superClassName, info); } - subClasses.add(className); - if (!reader.isInterface()) + info.addSubClass(className); + char[][] names = reader.getInterfaceNames(); + for (int j = 0; j < names.length; j++) { - char[][] names = reader.getInterfaceNames(); - for (int j = 0; j < names.length; j++) + String interfaceName = new String(names[j]).replace('/', '.'); + List implClasses = (List)interface2ImplClasses.get(interfaceName); + if (implClasses == null) { - String interfaceName = new String(names[j]).replace('/', '.'); - List implClasses = (List)interface2ImplClasses.get(interfaceName); - if (implClasses == null) - { - implClasses = new ArrayList(1); - interface2ImplClasses.put(interfaceName, implClasses); - } - implClasses.add(className); + implClasses = new ArrayList(1); + interface2ImplClasses.put(interfaceName, implClasses); } + implClasses.add(className); } } if (!isSkipAPIGen() && isAPI) @@ -545,6 +581,34 @@ public class API2ComponentAPI implements IClassVisitor } } + private class ClassHierarchyInfo + { + private String superClass; + private List subClass; + + public List getSubClass() + { + return subClass; + } + + public void addSubClass(String subClass) + { + if (this.subClass == null) + this.subClass = new ArrayList(1); + this.subClass.add(subClass); + } + + public String getSuperClass() + { + return superClass; + } + + public void setSuperClass(String superClass) + { + this.superClass = superClass; + } + } + public static void main(String[] args) { CommandOptionParser optionParser = new CommandOptionParser(args);