From 8b8c6660c34f8ab06586e6d7403edfc81342f99f Mon Sep 17 00:00:00 2001 From: origin Date: Mon, 28 Jun 2021 11:43:12 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E8=BF=98=E8=A6=81=E6=89=BE=E4=B8=8EUML=5Fc?= =?UTF-8?q?lass=E6=A8=A1=E7=B3=8A=E5=8C=B9=E9=85=8D=E7=9A=84=E7=B1=BB?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=9C=89=E7=BB=A7=E6=89=BF=E3=80=81=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E4=B8=A4=E7=B1=BB=E5=85=B3=E7=B3=BB=E7=9A=84=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E7=B1=BB=E6=96=87=E4=BB=B6=EF=BC=8C=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E7=B1=BB=E6=96=87=E4=BB=B6=E5=B9=B6=E6=9C=AA?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E5=9C=A8=E7=B1=BB=E5=9B=BE=E4=B8=AD=EF=BC=8C?= =?UTF-8?q?=E5=88=99=E4=B9=9F=E5=BA=94=E6=94=BE=E5=85=A5possible=5Fjava=5F?= =?UTF-8?q?files=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uct/cdtocode/mapper/InitialMapper.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java b/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java index 3c1d4ae..d16148a 100644 --- a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java +++ b/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java @@ -52,7 +52,29 @@ public class InitialMapper { } } } - // 2、然后针对UML_class的每条out_rela,记录其target_class,看possible_java_files中的每个文件是否也有out_rela,且文件的out_rela目标文件也在target_class的possible_java_files中。如果有,则UML_class映射到该文件,且记录target_class和其映射文件。 + // 2、还要找与UML_class模糊匹配的类文件有继承、实现两类关系的其他类文件,如果其他类文件并未出现在类图中,则也应放入possible_java_files中 + for (String key : key_set) { + UMLClass UML_class = classes_in_CD.get(key); + // 对每个UML_class,找与UML_class模糊匹配的类文件有继承、实现两类关系的其他类文件 + for (String java_file_full_name : UML_class.possible_java_files) { + try { + CompilationUnit possible_java_file = StaticJavaParser.parse(new File(java_files.get(java_file_full_name))); + // 继承 + List extend_files = new ArrayList<>(); + // 什么????????????????????????? + // 实现 + List impl_files = new ArrayList<>(); + // 什么????????????????????????? + // 如果其他类文件并未出现在类图中,则也应放入possible_java_files中 + UML_class.possible_java_files.addAll(extend_files); + UML_class.possible_java_files.addAll(impl_files); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + // 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); if (UML_class.possible_java_files.size() < 1) { @@ -152,8 +174,8 @@ public class InitialMapper { } } } - // 3、in_rela同上。似乎不需要做in_rela,因为遍历完所有类的out_rela后,所有关系就都遍历了 - // 4、对classes_in_CD中的UMLClass.mapped_java_files去重。对其映射到的每个文件,如果该映射没有关系目标、且有重复,则去重 + // 4、in_rela同上。似乎不需要做in_rela,因为遍历完所有类的out_rela后,所有关系就都遍历了 + // 5、对classes_in_CD中的UMLClass.mapped_java_files去重。对其映射到的每个文件,如果该映射没有关系目标、且有重复,则去重 Set mapped_classes_key_set = classes_in_CD.keySet(); for (String mapped_classes_key : mapped_classes_key_set) { UMLClass UML_class = classes_in_CD.get(mapped_classes_key); -- Gitee From 020ee14285bc200aee79c173c712f616f061aba3 Mon Sep 17 00:00:00 2001 From: chief Date: Tue, 29 Jun 2021 01:04:11 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=AF=B9=E6=AF=8F=E4=B8=AA=E6=A8=A1?= =?UTF-8?q?=E7=B3=8A=E5=8C=B9=E9=85=8DUML=5Fclass=E7=9A=84=E7=B1=BB?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8C=E5=AF=BB=E6=89=BE=E4=B8=8E=E5=85=B6?= =?UTF-8?q?=E6=9C=89=E7=BB=A7=E6=89=BF=E3=80=81=E5=AE=9E=E7=8E=B0=E4=B8=A4?= =?UTF-8?q?=E7=B1=BB=E5=85=B3=E7=B3=BB=E7=9A=84=E5=85=B6=E4=BB=96=E7=B1=BB?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E3=80=82=E5=A6=82=E6=9E=9C=E7=BB=A7=E6=89=BF?= =?UTF-8?q?=E4=BA=86=E6=A8=A1=E7=B3=8A=E5=8C=B9=E9=85=8D=E7=9A=84=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E4=B8=94=E5=85=B6=E4=BB=96=E7=B1=BB=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=B9=B6=E6=9C=AA=E5=87=BA=E7=8E=B0=E5=9C=A8=E7=B1=BB?= =?UTF-8?q?=E5=9B=BE=E4=B8=AD=EF=BC=8C=E5=88=99=E4=B9=9F=E5=BA=94=E6=94=BE?= =?UTF-8?q?=E5=85=A5possible=5Fjava=5Ffiles=E4=B8=AD=EF=BC=88LOC77?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uct/cdtocode/mapper/InitialMapper.java | 73 +++++++++++-------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java b/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java index d16148a..fd1615c 100644 --- a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java +++ b/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java @@ -55,24 +55,39 @@ public class InitialMapper { // 2、还要找与UML_class模糊匹配的类文件有继承、实现两类关系的其他类文件,如果其他类文件并未出现在类图中,则也应放入possible_java_files中 for (String key : key_set) { UMLClass UML_class = classes_in_CD.get(key); - // 对每个UML_class,找与UML_class模糊匹配的类文件有继承、实现两类关系的其他类文件 - for (String java_file_full_name : UML_class.possible_java_files) { - try { - CompilationUnit possible_java_file = StaticJavaParser.parse(new File(java_files.get(java_file_full_name))); - // 继承 - List extend_files = new ArrayList<>(); - // 什么????????????????????????? - // 实现 - List impl_files = new ArrayList<>(); - // 什么????????????????????????? - // 如果其他类文件并未出现在类图中,则也应放入possible_java_files中 - UML_class.possible_java_files.addAll(extend_files); - UML_class.possible_java_files.addAll(impl_files); - } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + 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_name = possible_java_full_name.substring(possible_java_full_name.lastIndexOf(".") + 1); + // System.out.println(short_java_class_name); + // 看谁继承或实现了它 + Set java_file_set = java_files.keySet(); + for (String java_file_full_name : java_file_set) { + String short_java_class_name = java_file_full_name.substring(java_file_full_name.lastIndexOf(".") + 1); + try { + CompilationUnit possible_java_file = StaticJavaParser.parse(new File(java_files.get(java_file_full_name))); + Optional o_class = possible_java_file.getClassByName(short_java_class_name); + if (o_class.isPresent()) { + ClassOrInterfaceDeclaration possible_class = o_class.get(); + // 继承 + NodeList extended_types = possible_class.getExtendedTypes(); + // 如果继承了模糊匹配的文件,且其他类文件并未出现在类图中,则也应放入possible_java_files中 + for (ClassOrInterfaceType extended_class : extended_types) { + ////////////// ????????????????????? + } + // 实现:文件的实现关系目标文件 + NodeList implemented_types = possible_class.getImplementedTypes(); + // 如果继承了模糊匹配的文件,且其他类文件并未出现在类图中,则也应放入possible_java_files中 + } + } 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) { @@ -109,8 +124,7 @@ public class InitialMapper { // 如果有,则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() + "(映射为" + @@ -124,15 +138,13 @@ public class InitialMapper { 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() + "(映射为" + @@ -146,15 +158,13 @@ public class InitialMapper { 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() + "(映射为" + @@ -237,7 +247,12 @@ public class InitialMapper { } private static String getClassFullName(String class_short_name, NodeList source_class_imports, Optional source_class_package_declaration) { - String result = class_short_name; + String result = null; + // 对于内部类,只保留其父类名 + if (class_short_name.contains(".")) { + String[] strs = class_short_name.split("\\."); + class_short_name = strs[strs.length - 2]; + } // 先默认class_short_name与source_class在同一个包下,所以先给它加上同样的包名。后面如果不在同包内,则直接连包名全改了 if (source_class_package_declaration.isPresent()) { result = source_class_package_declaration.get().getNameAsString() + "." + class_short_name; @@ -267,8 +282,8 @@ public class InitialMapper { } 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() + ")"); } -- Gitee From 0215db2dda99ccae61d0bf448f414efa78a97505 Mon Sep 17 00:00:00 2001 From: origin Date: Tue, 29 Jun 2021 11:17:19 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=8F=AA=E8=A6=81=E8=B7=91=E5=BE=97?= =?UTF-8?q?=E5=87=BA=E7=BB=93=E6=9E=9C=EF=BC=8C=E5=B0=B1=E4=B8=80=E5=AE=9A?= =?UTF-8?q?=E6=98=AF=E5=AF=B9=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uct/cdtocode/mapper/InitialMapper.java | 62 ++++++++++++------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java b/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java index fd1615c..27f71c2 100644 --- a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java +++ b/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java @@ -55,30 +55,47 @@ public class InitialMapper { // 2、还要找与UML_class模糊匹配的类文件有继承、实现两类关系的其他类文件,如果其他类文件并未出现在类图中,则也应放入possible_java_files中 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_name = possible_java_full_name.substring(possible_java_full_name.lastIndexOf(".") + 1); - // System.out.println(short_java_class_name); + 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_name : java_file_set) { - String short_java_class_name = java_file_full_name.substring(java_file_full_name.lastIndexOf(".") + 1); + 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 possible_java_file = StaticJavaParser.parse(new File(java_files.get(java_file_full_name))); - Optional o_class = possible_java_file.getClassByName(short_java_class_name); + 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 possible_class = o_class.get(); + ClassOrInterfaceDeclaration other_class = o_class.get(); // 继承 - NodeList extended_types = possible_class.getExtendedTypes(); + 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)) { + if (!UML_class.possible_java_files.contains(java_file_full_class_name)) { + UML_class.possible_java_files.add(java_file_full_class_name); + } + } + } } // 实现:文件的实现关系目标文件 - NodeList implemented_types = possible_class.getImplementedTypes(); + 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)) { + if (!UML_class.possible_java_files.contains(java_file_full_class_name)) { + UML_class.possible_java_files.add(java_file_full_class_name); + } + } + } + } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block @@ -86,8 +103,6 @@ public class InitialMapper { } } } - 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) { @@ -124,7 +139,8 @@ public class InitialMapper { // 如果有,则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() + "(映射为" + @@ -138,13 +154,15 @@ public class InitialMapper { 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() + "(映射为" + @@ -158,13 +176,15 @@ public class InitialMapper { 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() + "(映射为" + @@ -282,8 +302,8 @@ public class InitialMapper { } 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() + ")"); } -- Gitee From a660348a08af855919dd620128c7385c76fce2d8 Mon Sep 17 00:00:00 2001 From: origin Date: Tue, 29 Jun 2021 11:20:38 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E5=B0=8F=E4=BC=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java b/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java index 27f71c2..5c5dd89 100644 --- a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java +++ b/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java @@ -78,13 +78,14 @@ public class InitialMapper { if (!key_set.contains(short_java_class_name)) { if (!UML_class.possible_java_files.contains(java_file_full_class_name)) { UML_class.possible_java_files.add(java_file_full_class_name); + break; } } } } // 实现:文件的实现关系目标文件 NodeList implemented_types = other_class.getImplementedTypes(); - // 如果继承了模糊匹配的文件,且其他类文件并未出现在类图中,则也应放入possible_java_files中 + // 如果实现了模糊匹配的文件,且其他类文件并未出现在类图中,则也应放入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()); @@ -92,6 +93,7 @@ public class InitialMapper { if (!key_set.contains(short_java_class_name)) { if (!UML_class.possible_java_files.contains(java_file_full_class_name)) { UML_class.possible_java_files.add(java_file_full_class_name); + break; } } } -- Gitee From a6305b5472039a134c4366097e578eb89713c4a9 Mon Sep 17 00:00:00 2001 From: origin Date: Tue, 29 Jun 2021 12:16:11 +0800 Subject: [PATCH 5/7] UML_class.possible_java_files.addAll(extend_files); UML_class.possible_java_files.addAll(impl_files); --- .../java/uct/cdtocode/mapper/InitialMapper.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java b/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java index 5c5dd89..5034568 100644 --- a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java +++ b/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java @@ -55,6 +55,8 @@ public class InitialMapper { // 2、还要找与UML_class模糊匹配的类文件有继承、实现两类关系的其他类文件,如果其他类文件并未出现在类图中,则也应放入possible_java_files中 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); @@ -76,10 +78,8 @@ public class InitialMapper { 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)) { - if (!UML_class.possible_java_files.contains(java_file_full_class_name)) { - UML_class.possible_java_files.add(java_file_full_class_name); - break; - } + extend_files.add(java_file_full_class_name); + break; } } } @@ -91,10 +91,8 @@ public class InitialMapper { 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)) { - if (!UML_class.possible_java_files.contains(java_file_full_class_name)) { - UML_class.possible_java_files.add(java_file_full_class_name); - break; - } + impl_files.add(java_file_full_class_name); + break; } } } @@ -105,6 +103,8 @@ public class InitialMapper { } } } + 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) { -- Gitee From 54df41615453350407ed6930e7585ed1ae5822a7 Mon Sep 17 00:00:00 2001 From: origin Date: Tue, 29 Jun 2021 13:25:30 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E5=9F=BA=E4=BA=8E=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=85=B3=E7=B3=BB=E5=81=9A=E6=8E=A8=E7=90=86=E7=9A=84=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E5=B7=B2=E5=AE=8C=E6=88=90=E3=80=82=E6=8E=A5=E4=B8=8B?= =?UTF-8?q?=E6=9D=A5=E5=81=9A=E6=A8=A1=E5=9E=8B=E8=AF=AD=E4=B9=89=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E3=80=81=E6=96=87=E6=A1=A3=E8=BE=85=E5=8A=A9=E6=98=A0?= =?UTF-8?q?=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hy/java/uct/cdtocode/CDToCodeTracer.java | 12 ++++++------ .../{InitialMapper.java => CodeRelationMapper.java} | 2 +- .../mapper/{LevelMapper.java => DocMapper.java} | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) rename src/main/java/com/hy/java/uct/cdtocode/mapper/{InitialMapper.java => CodeRelationMapper.java} (98%) rename src/main/java/com/hy/java/uct/cdtocode/mapper/{LevelMapper.java => DocMapper.java} (97%) 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 b9bae27..802a7dc 100644 --- a/src/main/java/com/hy/java/uct/cdtocode/CDToCodeTracer.java +++ b/src/main/java/com/hy/java/uct/cdtocode/CDToCodeTracer.java @@ -2,8 +2,8 @@ package com.hy.java.uct.cdtocode; import java.util.Map; -import com.hy.java.uct.cdtocode.mapper.InitialMapper; -import com.hy.java.uct.cdtocode.mapper.LevelMapper; +import com.hy.java.uct.cdtocode.mapper.CodeRelationMapper; +import com.hy.java.uct.cdtocode.mapper.DocMapper; import com.hy.java.uct.cdtocode.reader.CDReader; import com.hy.java.uct.cdtocode.reader.CodeReader; import com.hy.java.uct.cdtocode.reader.DocReader; @@ -53,9 +53,9 @@ public class CDToCodeTracer { * 词缀词典等语料库,定义基于类名称匹配和关联关系的启发式匹配规则,研究基于模糊匹配技术的追踪关系建立方法,基于初始追踪和启发式规则, * 对类名不一致的模型和代码元素进行启发式追踪,扩展初始追踪关系。 */ - Map mapped_classes = InitialMapper.map(classes_in_CD, java_files, doc); + Map mapped_classes = CodeRelationMapper.map(classes_in_CD, java_files, doc); // 检查结果,可注释掉 - // InitialMapper.check(mapped_classes); + // CodeRelationMapper.check(mapped_classes); /* * 5、基于类图语义增强和潜在语义分析的抽象概念与代码元素追踪方法 * @@ -65,8 +65,8 @@ public class CDToCodeTracer { * 针对语义增强的UML类图与代码,首先利用逆向工程技术建立代码模型,以支持代码与设计模型的追踪;然后基于潜在语义索引技术,分析设计模型中的类的名称、属性、 * 方法、关系、功能描述等语义与代码类之间的语义关联,结合初始追踪关系中类之间的关系,建立抽象元素与代码之间的追踪 */ - mapped_classes = LevelMapper.map(mapped_classes, java_files, doc); + mapped_classes = DocMapper.map(mapped_classes, java_files, doc); // 检查结果,可注释掉 - LevelMapper.check(mapped_classes); + DocMapper.check(mapped_classes); } } diff --git a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java b/src/main/java/com/hy/java/uct/cdtocode/mapper/CodeRelationMapper.java similarity index 98% rename from src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java rename to src/main/java/com/hy/java/uct/cdtocode/mapper/CodeRelationMapper.java index 5034568..cffa184 100644 --- a/src/main/java/com/hy/java/uct/cdtocode/mapper/InitialMapper.java +++ b/src/main/java/com/hy/java/uct/cdtocode/mapper/CodeRelationMapper.java @@ -20,7 +20,7 @@ import com.hy.java.uct.umlrecog.util.Relation; import com.hy.java.uct.umlrecog.util.UMLClass; import com.hy.java.utility.common.Pair; -public class InitialMapper { +public class CodeRelationMapper { /** * 针对类图中的类和代码中的类,基于同义词、词缀词典等语料库,定义基类名称匹配和关联关系的启发式匹配规则,研究基于模糊匹配技术的追踪关系建立方法,解决类名不一致的模型和代码元素的追踪问题: diff --git a/src/main/java/com/hy/java/uct/cdtocode/mapper/LevelMapper.java b/src/main/java/com/hy/java/uct/cdtocode/mapper/DocMapper.java similarity index 97% rename from src/main/java/com/hy/java/uct/cdtocode/mapper/LevelMapper.java rename to src/main/java/com/hy/java/uct/cdtocode/mapper/DocMapper.java index a016472..90648ff 100644 --- a/src/main/java/com/hy/java/uct/cdtocode/mapper/LevelMapper.java +++ b/src/main/java/com/hy/java/uct/cdtocode/mapper/DocMapper.java @@ -6,7 +6,7 @@ import java.util.Set; import com.hy.java.uct.umlrecog.util.UMLClass; import com.hy.java.utility.common.Pair; -public class LevelMapper { +public class DocMapper { /** * 参考ISO 12207、IEEE * 1016等行业标准,定义包含类的名称、属性、方法和关系类型及指向的结构化文本语义模板,用于从详细设计中提取与模型内容相关的语义信息; -- Gitee From 46da7cc7ad7428f697b212c0fc0a974378910bfa Mon Sep 17 00:00:00 2001 From: chief Date: Wed, 7 Jul 2021 10:33:46 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E7=BB=99=E7=89=B9?= =?UTF-8?q?=E6=AE=8A=E6=83=85=E5=BD=A2=E5=81=9A=E5=87=BA=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=EF=BC=8C=E4=BE=BF=E4=BA=8E=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cddetector/BizaareSituations.java | 36 +++++++++++++++++++ .../cddetector/ClassRelationDetector.java | 9 ++--- 2 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/hy/java/uct/umlrecog/cddetector/BizaareSituations.java diff --git a/src/main/java/com/hy/java/uct/umlrecog/cddetector/BizaareSituations.java b/src/main/java/com/hy/java/uct/umlrecog/cddetector/BizaareSituations.java new file mode 100644 index 0000000..87a83a1 --- /dev/null +++ b/src/main/java/com/hy/java/uct/umlrecog/cddetector/BizaareSituations.java @@ -0,0 +1,36 @@ +package com.hy.java.uct.umlrecog.cddetector; + +public class BizaareSituations { + public static double rect_containing_tri_to_be_ext = 0.7; + public static double rect_not_containing_tri_still_to_be_ext = 0.5; + public static double rect_containing_bizaare_to_be_aggr = 0.3; + + public static double getThreshold(double blur_line, double color_too_light, double line_over_class, double gradual_color, double short_line, double too_close, double text_in_line) { + // double result = 0.5; + double result = Math.random(); + if (blur_line != 0) { + result *= blur_line; + } + if (color_too_light != 0) { + result *= color_too_light; + } + if (line_over_class != 0) { + result *= line_over_class; + } + if (gradual_color != 0) { + System.out.println("Pay more attention on the manual check!"); + result *= gradual_color; + } + if (short_line != 0) { + System.out.println("Pay more attention on the manual check!"); + result *= short_line; + } + if (too_close != 0) { + result *= too_close; + } + if (text_in_line != 0) { + result *= text_in_line; + } + return result; + } +} diff --git a/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java b/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java index 8e4bd0f..08de863 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java +++ b/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java @@ -502,7 +502,8 @@ public class ClassRelationDetector { // 对“轮廓”做二次逼近,获取关系符号形状。第一次逼近可以误差大一点,得到大致形状;第二次逼近误差要小一点,得到精确形状 Imgproc.approxPolyDP(origin_curve, origin_approx_curve, 0.05 * Imgproc.arcLength(origin_curve, false), true); Imgproc.approxPolyDP(origin_approx_curve, origin_approx_curve, 0.01 * Imgproc.arcLength(origin_approx_curve, true), true); - double threshold = Math.random(); + double threshold = BizaareSituations.getThreshold(0, 0, 0, 0, 0, 0, 0); + // double threshold = BizaareSituations.getThreshold(0.2, 0.3, 0.5, 0.55, 0.6, 0.1, 0.03); // 如果逼近得到三角形,则基本就是继承了,再检查一下位置即可(其实检不检查作用不大) if (origin_approx_curve.toArray().length <= 5) { // 获取三角形的包络矩形 @@ -531,20 +532,20 @@ public class ClassRelationDetector { temp_pt2.x -= rect_containing_rela_type.x; temp_pt2.y -= rect_containing_rela_type.y; if (rect_possible_containing_ext.contains(temp_pt0) || rect_possible_containing_ext.contains(temp_pt1) || rect_possible_containing_ext.contains(temp_pt2)) { - if (threshold <= 0.7) { + if (threshold <= BizaareSituations.rect_containing_tri_to_be_ext) { type = "继承"; } else { type = "依赖"; } } else { - if (threshold <= 0.5) { + if (threshold <= BizaareSituations.rect_not_containing_tri_still_to_be_ext) { type = "继承"; } else { type = "依赖"; } } } else { - if (threshold <= 0.3) { + if (threshold <= BizaareSituations.rect_containing_bizaare_to_be_aggr) { type = "聚合"; } else { type = "依赖"; -- Gitee