diff --git a/src/main/java/com/hy/java/uct/cdtocode/CDToCodeTracer.java b/src/main/java/com/hy/java/uct/cdtocode/CDToCodeTracer.java index 802a7dc1d6a31c9831b636ca3f1ba85247243db6..b2e4d5ae01fe3bfa812fe484bf3692b8be9f6fd5 100644 --- a/src/main/java/com/hy/java/uct/cdtocode/CDToCodeTracer.java +++ b/src/main/java/com/hy/java/uct/cdtocode/CDToCodeTracer.java @@ -3,7 +3,7 @@ package com.hy.java.uct.cdtocode; import java.util.Map; import com.hy.java.uct.cdtocode.mapper.CodeRelationMapper; -import com.hy.java.uct.cdtocode.mapper.DocMapper; +import com.hy.java.uct.cdtocode.mapper.DocAnalyzer; import com.hy.java.uct.cdtocode.reader.CDReader; import com.hy.java.uct.cdtocode.reader.CodeReader; import com.hy.java.uct.cdtocode.reader.DocReader; @@ -47,26 +47,27 @@ public class CDToCodeTracer { // 检查结果,可注释掉 // CodeReader.check(java_files); /* - * 4、遍历模型中的实体元素(类或对象),针对每个元素,在code中寻找能匹配的java文件 + * 4、分析文档信息。实际相当于增加类图中的UMLclass、类本身的内容、类之间关系 * - * 基于启发式模糊匹配的UML类图与代码追踪方法:首先针对类图中的类和代码中的类,基于类的名称进行字符串完全匹配,从而建立确定的初始追踪;基于同义词、 - * 词缀词典等语料库,定义基于类名称匹配和关联关系的启发式匹配规则,研究基于模糊匹配技术的追踪关系建立方法,基于初始追踪和启发式规则, - * 对类名不一致的模型和代码元素进行启发式追踪,扩展初始追踪关系。 + * ①读取类图classes_in_CD中所有类。 + * + * ②在设计文档doc中,根据类名查找相关语句。 + * + * ③分析语句中对“类与其他类的‘继承实现依赖’关系”、“类的功能”、“类具有的属性或方法”的解释。其中,关系应最终被解释为our_rela */ - Map mapped_classes = CodeRelationMapper.map(classes_in_CD, java_files, doc); + // 如果想对比有没有文档对追踪的影响,则注释掉下一行即可。注意下面几行也要注释和解锁 + Map possible_classes_to_be_mapped_in_doc = DocAnalyzer.analyze(classes_in_CD, doc); // 检查结果,可注释掉 - // CodeRelationMapper.check(mapped_classes); + // DocMapper.check(possible_classes_to_be_mapped_in_doc); /* - * 5、基于类图语义增强和潜在语义分析的抽象概念与代码元素追踪方法 + * 5、遍历模型中的实体元素(类或对象),针对每个元素,在code中寻找能匹配的java文件 * - * 参考ISO 12207、IEEE - * 1016等行业标准,定义包含类的名称、属性、方法和关系类型及指向的结构化文本语义模板,用于从详细设计中提取与模型内容相关的语义信息; - * 研究基于自然语言处理技术和语义模板、从文档中提取与模型元素相关信息的方法,增强模型中类和各种关系的信息量、细化其具体含义,提高其与代码追踪的可用程度; - * 针对语义增强的UML类图与代码,首先利用逆向工程技术建立代码模型,以支持代码与设计模型的追踪;然后基于潜在语义索引技术,分析设计模型中的类的名称、属性、 - * 方法、关系、功能描述等语义与代码类之间的语义关联,结合初始追踪关系中类之间的关系,建立抽象元素与代码之间的追踪 + * 基于启发式模糊匹配的UML类图与代码追踪方法:首先针对类图中的类和代码中的类,基于类的名称进行字符串完全匹配,从而建立确定的初始追踪;基于同义词、 词缀词典等语料库,定义基于类名称匹配和关联关系的启发式匹配规则,研究基于模糊匹配技术的追踪关系建立方法,基于初始追踪和启发式规则, 对类名不一致的模型和代码元素进行启发式追踪,扩展初始追踪关系。 */ - mapped_classes = DocMapper.map(mapped_classes, java_files, doc); + Map mapped_classes = CodeRelationMapper.map(possible_classes_to_be_mapped_in_doc, java_files); + // 如果想对比有没有文档对追踪的影响,则注释掉上一行,并解开下一行 + // Map mapped_classes = CodeRelationMapper.map(classes_in_CD, java_files); // 检查结果,可注释掉 - DocMapper.check(mapped_classes); + // CodeRelationMapper.check(mapped_classes); } } diff --git a/src/main/java/com/hy/java/uct/cdtocode/mapper/CodeRelationMapper.java b/src/main/java/com/hy/java/uct/cdtocode/mapper/CodeRelationMapper.java index cffa18445a298625484e8b49184cb0d8d6391220..12171a5a82fc5b3b84d1676f59b295b23d540b18 100644 --- a/src/main/java/com/hy/java/uct/cdtocode/mapper/CodeRelationMapper.java +++ b/src/main/java/com/hy/java/uct/cdtocode/mapper/CodeRelationMapper.java @@ -23,7 +23,7 @@ import com.hy.java.utility.common.Pair; public class CodeRelationMapper { /** - * 针对类图中的类和代码中的类,基于同义词、词缀词典等语料库,定义基类名称匹配和关联关系的启发式匹配规则,研究基于模糊匹配技术的追踪关系建立方法,解决类名不一致的模型和代码元素的追踪问题: + * 针对类图中的类和代码中的类,基于同义词、词缀词典等语料库,定义基类名称匹配和关联关系的启发式匹配规则,研究基于模糊匹配技术的追踪关系建立方法,解决类名不一致、内容不一致的模型和代码元素的追踪问题: *

*

    *
  • 1、针对类图中的每个类,基于类的名称、与代码中的类文件进行字符串模糊匹配,从源码文件中选出可能映射的文件,存在UML_class.possible_java_files中 @@ -33,17 +33,18 @@ public class CodeRelationMapper { *
  • 3、in_rela同上。 *
* - * @param classes_in_CD 键值对:<类名(图里的类名),类对象(UMLClass对象)> - * @param java_files 键值对:<类全称(包+类名),java文件地址(可用javaparser解析文件内容)> - * @param doc + * @param possible_classes_to_be_mapped_in_doc 键值对:<类名(图里的类名),类对象(UMLClass对象)> + * @param java_files 键值对:<类全称(包+类名),java文件地址(可用javaparser解析文件内容)> * * @return 根据名称相似度和关系启发式映射的classes */ - public static Map map(Map classes_in_CD, Map java_files, String doc) { - Set key_set = classes_in_CD.keySet(); - // 1、针对类图中的每个类,基于类的名称、与代码中的类文件进行字符串模糊匹配,从源码文件中选出可能映射的文件,存在UML_class.possible_java_files中 + public static Map map(Map possible_classes_to_be_mapped_in_doc, Map java_files) { + Set key_set = possible_classes_to_be_mapped_in_doc.keySet(); + /* + * 1、针对类图中的每个类,基于类的名称、与代码中的类文件进行字符串模糊匹配,从源码文件中选出可能映射的文件,存在UML_class.possible_java_files中 + */ for (String key : key_set) { - UMLClass UML_class = classes_in_CD.get(key); + UMLClass UML_class = possible_classes_to_be_mapped_in_doc.get(key); // 对每个UML_class,根据其title,找java_files中类全称的类名与其相似的java文件 Set java_file_set = java_files.keySet(); for (String java_file_full_name : java_file_set) { @@ -52,63 +53,21 @@ public class CodeRelationMapper { } } } - // 2、还要找与UML_class模糊匹配的类文件有继承、实现两类关系的其他类文件,如果其他类文件并未出现在类图中,则也应放入possible_java_files中 + /* + * 2、还要找与UML_class模糊匹配的类文件有继承、实现两类关系的其他类文件,如果其他类文件并未出现在类图中,则也应放入possible_java_files中 + * + * 这一段对性能影响最严重,可以抽成一个方法、并检查注释掉后对结果有多大影响。如果对结果影响不大,则可以去掉,提高性能 + */ + addOtherPossibleFiles(possible_classes_to_be_mapped_in_doc, java_files); + /* + * 3、然后针对UML_class的每条out_rela,记录其target_class。 + * + * 然后看UML_class.possible_java_files中的每个文件是否也有out_rela。 + * + * 如果UML_class“可能映射到的文件”有out_rela,且文件的out_rela目标文件被包含于target_class.possible_java_files中,则UML_class映射到该文件,且记录target_class和其映射文件。 + */ for (String key : key_set) { - UMLClass UML_class = classes_in_CD.get(key); - List extend_files = new ArrayList<>(); - List impl_files = new ArrayList<>(); - // 对每个模糊匹配UML_class的类文件,寻找与其有继承、实现两类关系的其他类文件 - for (String possible_java_full_name : UML_class.possible_java_files) { - String possible_java_file_short_name = possible_java_full_name.substring(possible_java_full_name.lastIndexOf(".") + 1); - // System.out.println(possible_java_file_short_name); - // 看谁继承或实现了它 - Set java_file_set = java_files.keySet(); - for (String java_file_full_class_name : java_file_set) { - String short_java_class_name = java_file_full_class_name.substring(java_file_full_class_name.lastIndexOf(".") + 1); - try { - CompilationUnit other_java_file = StaticJavaParser.parse(new File(java_files.get(java_file_full_class_name))); - Optional o_class = other_java_file.getClassByName(short_java_class_name); - if (o_class.isPresent()) { - ClassOrInterfaceDeclaration other_class = o_class.get(); - // 继承 - NodeList extended_types = other_class.getExtendedTypes(); - // 如果继承了模糊匹配的文件,且其他类文件并未出现在类图中,则也应放入possible_java_files中 - for (ClassOrInterfaceType extended_class : extended_types) { - // 需获取继承关系目标文件的类全称 - String extended_class_full_name = getClassFullName(extended_class.asString(), other_java_file.getImports(), other_java_file.getPackageDeclaration()); - if (extended_class_full_name.substring(extended_class_full_name.lastIndexOf(".") + 1).equals(possible_java_file_short_name)) { - if (!key_set.contains(short_java_class_name)) { - extend_files.add(java_file_full_class_name); - break; - } - } - } - // 实现:文件的实现关系目标文件 - NodeList implemented_types = other_class.getImplementedTypes(); - // 如果实现了模糊匹配的文件,且其他类文件并未出现在类图中,则也应放入possible_java_files中 - for (ClassOrInterfaceType implemented_class : implemented_types) { - // 需获取实现关系目标文件的类全称 - String implemented_class_full_name = getClassFullName(implemented_class.asString(), other_java_file.getImports(), other_java_file.getPackageDeclaration()); - if (implemented_class_full_name.substring(implemented_class_full_name.lastIndexOf(".") + 1).equals(possible_java_file_short_name)) { - if (!key_set.contains(short_java_class_name)) { - impl_files.add(java_file_full_class_name); - break; - } - } - } - } - } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - UML_class.possible_java_files.addAll(extend_files); - UML_class.possible_java_files.addAll(impl_files); - } - // 3、然后针对UML_class的每条out_rela,记录其target_class,看possible_java_files中的每个文件是否也有out_rela,且文件的out_rela目标文件也在target_class的possible_java_files中。如果有,则UML_class映射到该文件,且记录target_class和其映射文件。 - for (String key : key_set) { - UMLClass UML_class = classes_in_CD.get(key); + UMLClass UML_class = possible_classes_to_be_mapped_in_doc.get(key); if (UML_class.possible_java_files.size() < 1) { // System.out.println(UML_class.getTitle() + "\t" + "没有映射"); } else { @@ -141,8 +100,7 @@ public class CodeRelationMapper { // 如果有,则UML_class映射到该文件,且记录target_class和其映射文件。 if (if_target_class_possible_files_contain_class.getLeft()) { // UML_class映射到这样一个文件,且有目标类target_class - UML_class.mapped_java_files.add(Pair.createPair(java_files.get(possible_java_full_name), - Pair.createPair(Pair.createPair(target_class, java_files.get(if_target_class_possible_files_contain_class.getRight())), "继承"))); + UML_class.mapped_java_files.add(Pair.createPair(java_files.get(possible_java_full_name), Pair.createPair(Pair.createPair(target_class, java_files.get(if_target_class_possible_files_contain_class.getRight())), "继承"))); // 目标类target_class正好也映射到一个文件上了。这会把一些只有进没有出的class也映射到 target_class.mapped_java_files.add(Pair.createPair(java_files.get(if_target_class_possible_files_contain_class.getRight()), null)); // System.out.println(UML_class.getTitle() + "(映射为" + @@ -156,15 +114,13 @@ public class CodeRelationMapper { NodeList implemented_types = possible_class.getImplementedTypes(); for (ClassOrInterfaceType implemented_class : implemented_types) { // 需获取实现关系目标文件的类全称 - String implemented_class_full_name = getClassFullName(implemented_class.asString(), possible_java_file.getImports(), - possible_java_file.getPackageDeclaration()); + String implemented_class_full_name = getClassFullName(implemented_class.asString(), possible_java_file.getImports(), possible_java_file.getPackageDeclaration()); // 判断文件的out_rela目标类全称是否也在target_class的possible_java_files中 Pair if_target_class_possible_files_contain_class = possibleFilesContainClass(target_class.possible_java_files, implemented_class_full_name); // 如果有,则UML_class映射到该文件,且记录target_class和其映射文件。 if (if_target_class_possible_files_contain_class.getLeft()) { // UML_class映射到这样一个文件,且有目标类target_class - UML_class.mapped_java_files.add(Pair.createPair(java_files.get(possible_java_full_name), - Pair.createPair(Pair.createPair(target_class, java_files.get(if_target_class_possible_files_contain_class.getRight())), "实现"))); + UML_class.mapped_java_files.add(Pair.createPair(java_files.get(possible_java_full_name), Pair.createPair(Pair.createPair(target_class, java_files.get(if_target_class_possible_files_contain_class.getRight())), "实现"))); // 目标类target_class正好也映射到一个文件上了。这会把一些只有进没有出的class也映射到 target_class.mapped_java_files.add(Pair.createPair(java_files.get(if_target_class_possible_files_contain_class.getRight()), null)); // System.out.println(UML_class.getTitle() + "(映射为" + @@ -178,15 +134,13 @@ public class CodeRelationMapper { NodeList imports = possible_java_file.getImports(); for (ImportDeclaration import_declaration : imports) { // 需获取实现关系目标文件的类全称 - String denpended_class_full_name = import_declaration.toString().substring(import_declaration.toString().lastIndexOf(" ") + 1, - import_declaration.toString().lastIndexOf(";")); + String denpended_class_full_name = import_declaration.toString().substring(import_declaration.toString().lastIndexOf(" ") + 1, import_declaration.toString().lastIndexOf(";")); // 判断文件的out_rela目标类全称是否也在target_class的possible_java_files中 Pair if_target_class_possible_files_contain_class = possibleFilesContainClass(target_class.possible_java_files, denpended_class_full_name); // 如果有,则UML_class映射到该文件,且记录target_class和其映射文件。 if (if_target_class_possible_files_contain_class.getLeft()) { // UML_class映射到这样一个文件,且有目标类target_class - UML_class.mapped_java_files.add(Pair.createPair(java_files.get(possible_java_full_name), - Pair.createPair(Pair.createPair(target_class, java_files.get(if_target_class_possible_files_contain_class.getRight())), "依赖"))); + UML_class.mapped_java_files.add(Pair.createPair(java_files.get(possible_java_full_name), Pair.createPair(Pair.createPair(target_class, java_files.get(if_target_class_possible_files_contain_class.getRight())), "依赖"))); // 目标类target_class正好也映射到一个文件上了。这会把一些只有进没有出的class也映射到 target_class.mapped_java_files.add(Pair.createPair(java_files.get(if_target_class_possible_files_contain_class.getRight()), null)); // System.out.println(UML_class.getTitle() + "(映射为" + @@ -206,11 +160,12 @@ public class CodeRelationMapper { } } } - // 4、in_rela同上。似乎不需要做in_rela,因为遍历完所有类的out_rela后,所有关系就都遍历了 - // 5、对classes_in_CD中的UMLClass.mapped_java_files去重。对其映射到的每个文件,如果该映射没有关系目标、且有重复,则去重 - Set mapped_classes_key_set = classes_in_CD.keySet(); + // 4、无需做in_rela,因为遍历完所有类的out_rela后,所有关系就都遍历了。所以这一步应该根据UMLClass的功能解释,直接找java_files中名称相似、功能解释相似的java文件,存到UML_class.mapped_java_files中 + + // 5、对possible_classes_to_be_mapped_in_doc中的UMLClass.mapped_java_files去重。对其映射到的每个文件,如果该映射没有关系目标、且有重复,则去重 + Set mapped_classes_key_set = possible_classes_to_be_mapped_in_doc.keySet(); for (String mapped_classes_key : mapped_classes_key_set) { - UMLClass UML_class = classes_in_CD.get(mapped_classes_key); + UMLClass UML_class = possible_classes_to_be_mapped_in_doc.get(mapped_classes_key); Set mapped_file_no_target = new HashSet<>(); List, String>>> mapped_file_has_target = new ArrayList<>(); if (!UML_class.mapped_java_files.isEmpty()) { @@ -228,7 +183,69 @@ public class CodeRelationMapper { UML_class.mapped_java_files.addAll(mapped_file_has_target); } } - return classes_in_CD; + return possible_classes_to_be_mapped_in_doc; + } + + /* + * 找与UML_class模糊匹配的类文件有继承、实现两类关系的其他类文件,如果其他类文件并未出现在类图中,则也应放入possible_java_files中 + * + * 由于这一段对性能影响最严重,所以抽成一个方法。最后检查注释掉后对结果有多大影响。如果对结果影响不大,则可以去掉,提高性能 + */ + private static void addOtherPossibleFiles(Map possible_classes_to_be_mapped_in_doc, Map java_files) { + Set key_set = possible_classes_to_be_mapped_in_doc.keySet(); + for (String key : key_set) { + UMLClass UML_class = possible_classes_to_be_mapped_in_doc.get(key); + List extend_files = new ArrayList<>(); + List impl_files = new ArrayList<>(); + // 对每个模糊匹配UML_class的类文件,寻找与其有继承、实现两类关系的其他类文件 + for (String possible_java_full_name : UML_class.possible_java_files) { + String possible_java_file_short_name = possible_java_full_name.substring(possible_java_full_name.lastIndexOf(".") + 1); + // System.out.println(possible_java_file_short_name); + // 看谁继承或实现了它 + Set java_file_set = java_files.keySet(); + for (String java_file_full_class_name : java_file_set) { + String short_java_class_name = java_file_full_class_name.substring(java_file_full_class_name.lastIndexOf(".") + 1); + try { + CompilationUnit other_java_file = StaticJavaParser.parse(new File(java_files.get(java_file_full_class_name))); + Optional o_class = other_java_file.getClassByName(short_java_class_name); + if (o_class.isPresent()) { + ClassOrInterfaceDeclaration other_class = o_class.get(); + // 继承 + NodeList extended_types = other_class.getExtendedTypes(); + // 如果继承了模糊匹配的文件,且其他类文件并未出现在类图中,则也应放入possible_java_files中 + for (ClassOrInterfaceType extended_class : extended_types) { + // 需获取继承关系目标文件的类全称 + String extended_class_full_name = getClassFullName(extended_class.asString(), other_java_file.getImports(), other_java_file.getPackageDeclaration()); + if (extended_class_full_name.substring(extended_class_full_name.lastIndexOf(".") + 1).equals(possible_java_file_short_name)) { + if (!key_set.contains(short_java_class_name)) { + extend_files.add(java_file_full_class_name); + break; + } + } + } + // 实现:文件的实现关系目标文件 + NodeList implemented_types = other_class.getImplementedTypes(); + // 如果实现了模糊匹配的文件,且其他类文件并未出现在类图中,则也应放入possible_java_files中 + for (ClassOrInterfaceType implemented_class : implemented_types) { + // 需获取实现关系目标文件的类全称 + String implemented_class_full_name = getClassFullName(implemented_class.asString(), other_java_file.getImports(), other_java_file.getPackageDeclaration()); + if (implemented_class_full_name.substring(implemented_class_full_name.lastIndexOf(".") + 1).equals(possible_java_file_short_name)) { + if (!key_set.contains(short_java_class_name)) { + impl_files.add(java_file_full_class_name); + break; + } + } + } + } + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + UML_class.possible_java_files.addAll(extend_files); + UML_class.possible_java_files.addAll(impl_files); + } } /** @@ -253,21 +270,6 @@ public class CodeRelationMapper { return false; } - /** - * 判断文件的out_rela目标文件是否也在target_class的possible_java_files中 - */ - private static Pair possibleFilesContainClass(List possible_java_classes_full_name, String out_rela_target_class_full_name) { - Pair result = Pair.createPair(false, null); - for (String possible_java_file_full_name : possible_java_classes_full_name) { - if (possible_java_file_full_name.equals(out_rela_target_class_full_name)) { - result.setLeft(true); - result.setRight(possible_java_file_full_name); - break; - } - } - return result; - } - private static String getClassFullName(String class_short_name, NodeList source_class_imports, Optional source_class_package_declaration) { String result = null; // 对于内部类,只保留其父类名 @@ -294,6 +296,21 @@ public class CodeRelationMapper { return result; } + /** + * 判断文件的out_rela目标文件是否也在target_class的possible_java_files中 + */ + private static Pair possibleFilesContainClass(List possible_java_classes_full_name, String out_rela_target_class_full_name) { + Pair result = Pair.createPair(false, null); + for (String possible_java_file_full_name : possible_java_classes_full_name) { + if (possible_java_file_full_name.equals(out_rela_target_class_full_name)) { + result.setLeft(true); + result.setRight(possible_java_file_full_name); + break; + } + } + return result; + } + public static void check(Map mapped_classes) { Set key_set = mapped_classes.keySet(); for (String key : key_set) { @@ -304,8 +321,8 @@ public class CodeRelationMapper { } else { for (Pair, String>> java_file_target_class : UML_class.mapped_java_files) { if (java_file_target_class.getRight() != null) { - System.out.println(UML_class.getTitle() + "(映射为" + java_file_target_class.getLeft() + ")" + java_file_target_class.getRight().getRight() + "了" - + java_file_target_class.getRight().getLeft().getLeft().getTitle() + "(映射为" + java_file_target_class.getRight().getLeft().getRight() + ")"); + System.out.println( + UML_class.getTitle() + "(映射为" + java_file_target_class.getLeft() + ")" + java_file_target_class.getRight().getRight() + "了" + java_file_target_class.getRight().getLeft().getLeft().getTitle() + "(映射为" + java_file_target_class.getRight().getLeft().getRight() + ")"); } else { System.out.println(UML_class.getTitle() + "(映射为" + java_file_target_class.getLeft() + ")"); } diff --git a/src/main/java/com/hy/java/uct/cdtocode/mapper/DocMapper.java b/src/main/java/com/hy/java/uct/cdtocode/mapper/DocAnalyzer.java similarity index 32% rename from src/main/java/com/hy/java/uct/cdtocode/mapper/DocMapper.java rename to src/main/java/com/hy/java/uct/cdtocode/mapper/DocAnalyzer.java index 90648ffb7ea004835e2c4d66f8614e7e32633486..e467081f32124ab49f8cc17000532be770087675 100644 --- a/src/main/java/com/hy/java/uct/cdtocode/mapper/DocMapper.java +++ b/src/main/java/com/hy/java/uct/cdtocode/mapper/DocAnalyzer.java @@ -6,31 +6,33 @@ import java.util.Set; import com.hy.java.uct.umlrecog.util.UMLClass; import com.hy.java.utility.common.Pair; -public class DocMapper { +public class DocAnalyzer { /** - * 参考ISO 12207、IEEE - * 1016等行业标准,定义包含类的名称、属性、方法和关系类型及指向的结构化文本语义模板,用于从详细设计中提取与模型内容相关的语义信息; - * 研究基于自然语言处理技术和语义模板、从文档中提取与模型元素相关信息的方法,增强模型中类和各种关系的信息量、细化其具体含义,提高其与代码追踪的可用程度; - * 针对语义增强的UML类图与代码,首先利用逆向工程技术建立代码模型,以支持代码与设计模型的追踪;然后基于潜在语义索引技术,分析设计模型中的类的名称、属性、 - * 方法、关系、功能描述等语义与代码类之间的语义关联,结合初始追踪关系中类之间的关系,建立抽象元素与代码之间的追踪 + * 分析文档信息。实际相当于增加类图中的UMLclass、类本身的内容、类之间关系 + * + * ①读取类图classes_in_CD中所有类。 + * + * ②在设计文档doc中,根据类名查找相关语句。 + * + * ③分析语句中对“类与其他类的‘继承实现依赖’关系”、“类的功能”、“类具有的属性或方法”的解释。其中,关系应最终被解释为our_rela */ - public static Map map(Map mapped_classes, Map java_files, String doc) { + public static Map analyze(Map possible_classes_to_be_mapped_in_doc, String doc) { // TODO Auto-generated method stub - return mapped_classes; + return possible_classes_to_be_mapped_in_doc; } - public static void check(Map mapped_classes) { - Set key_set = mapped_classes.keySet(); + public static void check(Map possible_classes_to_be_mapped_in_doc) { + Set key_set = possible_classes_to_be_mapped_in_doc.keySet(); for (String key : key_set) { System.out.println("=============================="); - UMLClass UML_class = mapped_classes.get(key); + UMLClass UML_class = possible_classes_to_be_mapped_in_doc.get(key); if (UML_class.mapped_java_files.isEmpty()) { System.out.println(UML_class.getTitle() + "没有映射"); } else { for (Pair, String>> java_file_target_class : UML_class.mapped_java_files) { if (java_file_target_class.getRight() != null) { - System.out.println(UML_class.getTitle() + "(映射为" + java_file_target_class.getLeft() + ")" + java_file_target_class.getRight().getRight() + "了" - + java_file_target_class.getRight().getLeft().getLeft().getTitle() + "(映射为" + java_file_target_class.getRight().getLeft().getRight() + ")"); + System.out.println( + UML_class.getTitle() + "(映射为" + java_file_target_class.getLeft() + ")" + java_file_target_class.getRight().getRight() + "了" + java_file_target_class.getRight().getLeft().getLeft().getTitle() + "(映射为" + java_file_target_class.getRight().getLeft().getRight() + ")"); } else { System.out.println(UML_class.getTitle() + "(映射为" + java_file_target_class.getLeft() + ")"); } @@ -38,5 +40,4 @@ public class DocMapper { } } } - } diff --git a/src/main/java/com/hy/java/uct/umlrecog/util/UMLClass.java b/src/main/java/com/hy/java/uct/umlrecog/util/UMLClass.java index 1100ac8b72c2c2a8415181343529b60185ba770f..b776403070503bfb962c84406644388e9090df4f 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/util/UMLClass.java +++ b/src/main/java/com/hy/java/uct/umlrecog/util/UMLClass.java @@ -30,6 +30,11 @@ public class UMLClass { */ public List in_relas = new ArrayList<>(); + /** + * 从文档中得到的该类的功能性解释。用于与代码中类的注释进行语义对比 + */ + public String description = null; + /** * java_files中类全称的类名与其相同的java文件 *