>}
+ *
+ * 追踪时记录Cls_code的full name,便于在map里查找
+ *
+ * 追踪概率Sim(Ent_doc,Cls_code)=名称相似度*属性方法相似度
+ */
+ public List> possibleMapped_javaFiles = new ArrayList<>();
+ /**
+ * 这个Entity所真正映射到的文件list(从possibleMapped_javaFiles中,根据关系推理而来)
+ *
+ * 每个映射保存了java文件地址和{@code List>}
+ */
+ public List trulyMapped_javaFiles = new ArrayList<>();
}
diff --git a/src/main/java/com/hy/java/uct/cdtocode/util/MappedFile.java b/src/main/java/com/hy/java/uct/cdtocode/util/MappedFile.java
index bfff30af37546b42ebed9a14ecc4365fb1892e51..c4826c71d75e25b995ddaef2b0a9fee7ef838f16 100644
--- a/src/main/java/com/hy/java/uct/cdtocode/util/MappedFile.java
+++ b/src/main/java/com/hy/java/uct/cdtocode/util/MappedFile.java
@@ -1,20 +1,27 @@
package com.hy.java.uct.cdtocode.util;
-import com.hy.java.uct.util.UMLClass;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.hy.java.uct.util.EntityRelation;
import com.hy.java.utility.common.Pair;
/**
* 一个类所真正映射到的文件
- *
- * 每个映射形式为,关系类型>>
*/
public class MappedFile {
// java文件地址
public String java_file_dir = null;
- // <某种关系的目标或源UMLClass', 该关系下UMLClass'映射的文件>
- public Pair source_or_target_class_with_mapped_file = null;
- // 关系类型
- public String relation_type = null;
- // 该映射的概率
- public double ratio = 0.0;
+ /**
+ * 在关系R下从Ent_doc追踪到Cls_code的概率
+ *
+ * PE_code(Ent_doc,Cls_code,R)=0.5×Sim(Ent_doc,Cls_code)+0.5×PR_doc(Ent_doc,Ent'_doc)
+ */
+ public List> PEcode_R_ls = new ArrayList<>();
+ /**
+ * 在关系R下从Cls_img追踪到Cls_code的概率
+ *
+ * P(Cls_img,Cls_code)=PE_doc(Cls_img,Ent_doc)×PE_code(Ent_doc,Cls_code,R)
+ */
+ public List> P_ls = new ArrayList<>();
}
diff --git a/src/main/java/com/hy/java/uct/util/EntityRelation.java b/src/main/java/com/hy/java/uct/util/EntityRelation.java
index d796d6d9cb4f90b2a103e5e7f85c3d3f248daa8f..c5c82838b4c19acfb57021158b0c8c713a4ab463 100644
--- a/src/main/java/com/hy/java/uct/util/EntityRelation.java
+++ b/src/main/java/com/hy/java/uct/util/EntityRelation.java
@@ -2,10 +2,16 @@ package com.hy.java.uct.util;
import com.hy.java.uct.cdtocode.util.Entity;
+/**
+ * Ent_doc与Ent_doc'具有关系(类型为relation_type)的概率为PR_doc
+ */
public class EntityRelation {
public Entity related_ent = null;
public String relation_type = "";
public double R_Entdoc_OtherEntdoc = 0.0;
public double and_or = 0.001;
+ /**
+ * PR_doc(Ent_doc,Ent'_doc)
+ */
public double PR_doc = 0.0;
}
diff --git a/src/main/java/com/hy/java/uct/util/UMLClass.java b/src/main/java/com/hy/java/uct/util/UMLClass.java
index 475cc3ac950697259aec58d62c0ef133f768487d..eb53a305ebd8a8c1778b7390f95322f8008559bc 100644
--- a/src/main/java/com/hy/java/uct/util/UMLClass.java
+++ b/src/main/java/com/hy/java/uct/util/UMLClass.java
@@ -44,18 +44,20 @@ public class UMLClass {
public Set mappedEnt_names = new HashSet<>();
/**
- * java_files中类名与this.title相似的java文件
- *
- * 从这些文件中去找真正的映射(由于抽象层次不同,所以可能不止一个java文件是真正的映射)。寻找时要参考关系网
+ * 这个类所真正映射到的文件list(由于抽象层次不同,所以可能不止一个java文件是真正的映射)
+ *
+ * 每个映射保存了java文件地址和P(Cls_img,Cls_code)
+ *
+ * 这个List里可能会有重复的结果,所以还需要过滤
*/
- public List possible_java_files = new ArrayList<>();
+ public List duplicated_mapped_javaFile_ls = new ArrayList<>();
/**
* 这个类所真正映射到的文件list(由于抽象层次不同,所以可能不止一个java文件是真正的映射)
- *
- * 每个映射形式为,关系类型>>
+ *
+ * 每个映射保存了java文件地址和P(Cls_img,Cls_code)
*/
- public List mapped_java_files = new ArrayList<>();
+ public List mapped_javaFile_ls = new ArrayList<>();
public String getTitle() {
return title;
diff --git a/src/main/resources/cdtocode/doc/basic-architecture-simEnts.txt b/src/main/resources/cdtocode/doc/basic-architecture-simEnts.txt
index 490efa0945e68bb01b3ea0391ab7225315830511..22a14092ae0139ecd5a970f1c72d7a82e19ec961 100644
--- a/src/main/resources/cdtocode/doc/basic-architecture-simEnts.txt
+++ b/src/main/resources/cdtocode/doc/basic-architecture-simEnts.txt
@@ -1,3 +1,4 @@
License EclipseLicense
+Connector Connector
Connector Connection
Connector ServerConnector
\ No newline at end of file
diff --git a/src/test/java/com/hy/java/uct/cdtocode/CodeRelationMapperTest.java b/src/test/java/com/hy/java/uct/cdtocode/CodeRelationMapperTest.java
index 34855befd87352a1c2daa148cc408872b494ca80..2c146e9ea10961e73fcf63ca0b06d02953c04cbb 100644
--- a/src/test/java/com/hy/java/uct/cdtocode/CodeRelationMapperTest.java
+++ b/src/test/java/com/hy/java/uct/cdtocode/CodeRelationMapperTest.java
@@ -27,6 +27,7 @@ import com.hy.java.uct.cdtocode.reader.CodeReader;
import com.hy.java.uct.cdtocode.util.MappedFile;
import com.hy.java.uct.util.ImgRelation;
import com.hy.java.uct.util.UMLClass;
+import com.hy.java.utility.common.FileEditor;
import com.hy.java.utility.common.Pair;
public class CodeRelationMapperTest {
@@ -40,278 +41,17 @@ public class CodeRelationMapperTest {
*/
private static final String code_dir = System.getProperty("user.dir") + "\\src\\main\\resources\\cdtocode\\code\\";
- 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 = 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) {
- if (titleSimilarWithFile(UML_class.getTitle(), java_file_full_name.substring(java_file_full_name.lastIndexOf(".") + 1))) {
- UML_class.possible_java_files.add(java_file_full_name);
- }
- }
- }
- /*
- * 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 = 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 {
- // 如果该UML_class没有out_rela,则possible_java_files就是映射结果
- if (UML_class.out_relas.isEmpty()) {
- for (String possible_java_full_name : UML_class.possible_java_files) {
- MappedFile mapped_file = new MappedFile();
- mapped_file.java_file_dir = java_files.get(possible_java_full_name);
- mapped_file.ratio = 1.0;
- UML_class.mapped_java_files.add(mapped_file);
- }
- } else {
- // 针对UML_class的每条out_rela
- for (ImgRelation out_rela : UML_class.out_relas) {
- // 记录其target_class
- UMLClass target_class = out_rela.target;
- // 看possible_java_files中的每个文件是否也有out_rela,且文件的out_rela目标文件也在target_class的possible_java_files中
- for (String possible_java_full_name : UML_class.possible_java_files) {
- String short_java_class_name = possible_java_full_name.substring(possible_java_full_name.lastIndexOf(".") + 1);
- try {
- CompilationUnit possible_java_file = StaticJavaParser.parse(new File(java_files.get(possible_java_full_name)));
- // 文件的out_rela包括继承、实现、依赖(其引入的包)。聚合实质是内部类,只需遍历编译目录查找文件名即可
- 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();
- for (ClassOrInterfaceType extended_class : extended_types) {
- // 需获取继承关系目标文件的类全称
- String extended_class_full_name = getClassFullName(extended_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, extended_class_full_name);
- // 如果有,则UML_class映射到该文件,且记录target_class和其映射文件。
- if (if_target_class_possible_files_contain_class.getLeft()) {
- // UML_class映射到这样一个文件,且有目标类target_class
- MappedFile mapped_file = new MappedFile();
- mapped_file.java_file_dir = java_files.get(possible_java_full_name);
- mapped_file.source_or_target_class_with_mapped_file = Pair.createPair(target_class, java_files.get(if_target_class_possible_files_contain_class.getRight()));
- mapped_file.relation_type = "继承";
- // 这个概率可以根据图里的UML_class和文件里的possible_class的“属性、方法的相似度”做进一步计算
- mapped_file.ratio = getSimilarity(UML_class, possible_class) + out_rela.ratio;
- UML_class.mapped_java_files.add(mapped_file);
- // 目标类target_class正好也映射到一个文件上了。这会把一些只有进没有出的class也映射到
- MappedFile target_class_mapped_file = new MappedFile();
- target_class_mapped_file.java_file_dir = java_files.get(if_target_class_possible_files_contain_class.getRight());
- try {
- // 解析target_class对应的java文件
- CompilationUnit target_class_mapped_java_file = StaticJavaParser.parse(new File(target_class_mapped_file.java_file_dir));
- // 文件的out_rela包括继承、实现、依赖(其引入的包)。聚合实质是内部类,只需遍历编译目录查找文件名即可
- Optional o_target_class = target_class_mapped_java_file.getClassByName(target_class.getTitle());
- if (o_target_class.isPresent()) {
- ClassOrInterfaceDeclaration possible_target_class = o_target_class.get();
- target_class_mapped_file.ratio = getSimilarity(target_class, possible_target_class) + out_rela.ratio;
- }
- } catch (Exception e) {
- target_class_mapped_file.ratio = out_rela.ratio;
- }
- target_class.mapped_java_files.add(target_class_mapped_file);
- // System.out.println(UML_class.getTitle() + "(映射为" +
- // java_files.get(possible_java_full_name) + ")继承了" + target_class.getTitle() +
- // "(映射为" +
- // java_files.get(if_target_class_possible_files_contain_class.getRight()) +
- // ")");
- }
- }
- // 实现:文件的实现关系目标文件
- 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());
- // 判断文件的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
- MappedFile mapped_file = new MappedFile();
- mapped_file.java_file_dir = java_files.get(possible_java_full_name);
- mapped_file.source_or_target_class_with_mapped_file = Pair.createPair(target_class, java_files.get(if_target_class_possible_files_contain_class.getRight()));
- mapped_file.relation_type = "实现";
- // 这个概率可以根据图里的UML_class和文件里的possible_class的“属性、方法的相似度”做进一步计算
- mapped_file.ratio = getSimilarity(UML_class, possible_class) + out_rela.ratio;
- UML_class.mapped_java_files.add(mapped_file);
- // 目标类target_class正好也映射到一个文件上了。这会把一些只有进没有出的class也映射到
- MappedFile target_class_mapped_file = new MappedFile();
- target_class_mapped_file.java_file_dir = java_files.get(if_target_class_possible_files_contain_class.getRight());
- try {
- // 解析target_class对应的java文件
- CompilationUnit target_class_mapped_java_file = StaticJavaParser.parse(new File(target_class_mapped_file.java_file_dir));
- // 文件的out_rela包括继承、实现、依赖(其引入的包)。聚合实质是内部类,只需遍历编译目录查找文件名即可
- Optional o_target_class = target_class_mapped_java_file.getClassByName(target_class.getTitle());
- if (o_target_class.isPresent()) {
- ClassOrInterfaceDeclaration possible_target_class = o_target_class.get();
- target_class_mapped_file.ratio = getSimilarity(target_class, possible_target_class) + out_rela.ratio;
- }
- } catch (Exception e) {
- target_class_mapped_file.ratio = out_rela.ratio;
- }
- target_class.mapped_java_files.add(target_class_mapped_file);
- // System.out.println(UML_class.getTitle() + "(映射为" +
- // java_files.get(possible_java_full_name) + ")实现了" + target_class.getTitle() +
- // "(映射为" +
- // java_files.get(if_target_class_possible_files_contain_class.getRight()) +
- // ")");
- }
- }
- // 依赖:文件的依赖关系目标文件
- 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(";"));
- // 判断文件的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
- MappedFile mapped_file = new MappedFile();
- mapped_file.java_file_dir = java_files.get(possible_java_full_name);
- mapped_file.source_or_target_class_with_mapped_file = Pair.createPair(target_class, java_files.get(if_target_class_possible_files_contain_class.getRight()));
- mapped_file.relation_type = "依赖";
- // 这个概率可以根据图里的UML_class和文件里的possible_class的“属性、方法的相似度”做进一步计算
- mapped_file.ratio = getSimilarity(UML_class, possible_class) + out_rela.ratio;
- UML_class.mapped_java_files.add(mapped_file);
- // 目标类target_class正好也映射到一个文件上了。这会把一些只有进没有出的class也映射到
- MappedFile target_class_mapped_file = new MappedFile();
- target_class_mapped_file.java_file_dir = java_files.get(if_target_class_possible_files_contain_class.getRight());
- try {
- // 解析target_class对应的java文件
- CompilationUnit target_class_mapped_java_file = StaticJavaParser.parse(new File(target_class_mapped_file.java_file_dir));
- // 文件的out_rela包括继承、实现、依赖(其引入的包)。聚合实质是内部类,只需遍历编译目录查找文件名即可
- Optional o_target_class = target_class_mapped_java_file.getClassByName(target_class.getTitle());
- if (o_target_class.isPresent()) {
- ClassOrInterfaceDeclaration possible_target_class = o_target_class.get();
- target_class_mapped_file.ratio = getSimilarity(target_class, possible_target_class) + out_rela.ratio;
- }
- } catch (Exception e) {
- target_class_mapped_file.ratio = out_rela.ratio;
- }
- target_class.mapped_java_files.add(target_class_mapped_file);
- // System.out.println(UML_class.getTitle() + "(映射为" +
- // java_files.get(possible_java_full_name) + ")依赖了" + target_class.getTitle() +
- // "(映射为" +
- // java_files.get(if_target_class_possible_files_contain_class.getRight()) +
- // ")");
- }
- }
- }
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
- }
- }
- // 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 = possible_classes_to_be_mapped_in_doc.get(mapped_classes_key);
- Set mapped_file_no_target = new HashSet<>();
- List mapped_file_has_target = new ArrayList<>();
- if (!UML_class.mapped_java_files.isEmpty()) {
- for (MappedFile java_file_and_target_class : UML_class.mapped_java_files) {
- if (java_file_and_target_class.source_or_target_class_with_mapped_file == null) {
- mapped_file_no_target.add(java_file_and_target_class.java_file_dir);
- } else {
- mapped_file_has_target.add(java_file_and_target_class);
- }
- }
- UML_class.mapped_java_files.clear();
- for (String file_dir : mapped_file_no_target) {
- MappedFile mapped_file = new MappedFile();
- mapped_file.java_file_dir = java_files.get(file_dir);
- mapped_file.ratio = 1.0;
- UML_class.mapped_java_files.add(mapped_file);
- }
- UML_class.mapped_java_files.addAll(mapped_file_has_target);
- }
- }
- 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);
+ private static final String test_data_dir = System.getProperty("user.dir") + "\\src\\test\\resources\\";
+
+ @Test
+ public void parseAttri() {
+ FileEditor fe = new FileEditor(test_data_dir + "attri");
+ String[] strs = fe.readFileToString().split("\n");
+ for (String s : strs) {
+ System.out.println("哈喽" + s.trim().split(":")[0].substring(1));
}
}
@@ -409,20 +149,4 @@ public class CodeRelationMapperTest {
// System.out.println(result);
return result;
}
-
- public static void main(String[] args) {
- /*
- * 1、读取模型信息
- */
- // 读取完UML图识别结果后,将实体信息保存在classes_in_CD里
- Map classes_in_CD = CDReader.read(cd_dir + "cd-eclipse_jetty.txt");
- /*
- * 2、读取code path指定的目录下所有java文件
- */
- Map java_files = CodeReader.read(code_dir + "code path");
- /*
- * 3、trace
- */
- map(classes_in_CD, java_files);
- }
}
diff --git a/src/test/resources/attri b/src/test/resources/attri
new file mode 100644
index 0000000000000000000000000000000000000000..b13c419086581dfdb008030902cd6c0fecc2b94f
--- /dev/null
+++ b/src/test/resources/attri
@@ -0,0 +1,2 @@
++host: String
++port: int
\ No newline at end of file