From dc988fd2cd170c54a08c627c33b1fa0f11f69a89 Mon Sep 17 00:00:00 2001 From: chief Date: Mon, 16 May 2022 18:58:21 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=B7=B2=E6=95=B4=E7=90=86=E5=AE=8C?= =?UTF-8?q?=E8=BF=BD=E8=B8=AA=E7=BB=93=E6=9E=9C=E3=80=82=E6=8E=A5=E4=B8=8B?= =?UTF-8?q?=E6=9D=A5=E5=B0=86=E7=BB=93=E6=9E=9C=E4=BF=9D=E5=AD=98=E8=87=B3?= =?UTF-8?q?xls=E6=96=87=E4=BB=B6=E4=B8=AD=EF=BC=88LOC1142=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdtocode/mapper/CodeMessageTracer.java | 181 +++++++++++++++--- ...essagePath.java => MessageTracedLink.java} | 4 +- .../java/com/hy/java/uct/util/sd/Message.java | 4 +- src/main/resources/sdtocode/Hadoop HDFS.xls | Bin 0 -> 13824 bytes 4 files changed, 155 insertions(+), 34 deletions(-) rename src/main/java/com/hy/java/uct/sdtocode/util/{TracedMessagePath.java => MessageTracedLink.java} (80%) create mode 100644 src/main/resources/sdtocode/Hadoop HDFS.xls diff --git a/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java b/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java index b3f3ea2..e16fabb 100644 --- a/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java +++ b/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java @@ -2,7 +2,10 @@ package com.hy.java.uct.sdtocode.mapper; import java.io.File; import java.io.FileNotFoundException; +import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -20,12 +23,20 @@ import com.github.javaparser.ast.body.FieldDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.Parameter; import com.github.javaparser.ast.stmt.BlockStmt; -import com.hy.java.uct.sdtocode.util.TracedMessagePath; +import com.hy.java.uct.sdtocode.util.MessageTracedLink; import com.hy.java.uct.util.sd.Message; import com.hy.java.uct.util.sd.UMLObject; import com.hy.java.utility.common.Pair; import com.hy.java.utility.common.Traverser; import com.hy.java.utility.common.Traverser.FileNode; + +import jxl.Workbook; +import jxl.write.Label; +import jxl.write.WritableSheet; +import jxl.write.WritableWorkbook; +import jxl.write.WriteException; +import jxl.write.biff.RowsExceededException; + import com.hy.java.utility.common.Triple; /** @@ -352,9 +363,9 @@ public class CodeMessageTracer { } if (max_codeLine_sim >= 0.625) { // 把这句代码记下来作为msg_inSD的追踪结果之一 - TracedMessagePath trace_path = new TracedMessagePath(); - trace_path.path.add(Triple.createTriple(uo_mapped_file_dir, code_line.trim(), attri_name_similarity * max_codeLine_sim)); - msg_inSD.traced_path_ls.add(trace_path); + MessageTracedLink trace_path = new MessageTracedLink(); + trace_path.identifiers.add(Triple.createTriple(uo_mapped_file_dir, code_line.trim(), attri_name_similarity * max_codeLine_sim)); + msg_inSD.traced_link_ls.add(trace_path); } } } @@ -446,9 +457,9 @@ public class CodeMessageTracer { // 这个阈值可以再改 if (sim > 0.5) { // 把这句代码记下来作为msg_inSD的追踪结果之一 - TracedMessagePath trace_path = new TracedMessagePath(); - trace_path.path.add(Triple.createTriple(attri_clsCode.getLeft(), md.getDeclarationAsString().trim(), attri_name_sim * sim)); - msg_inSD.traced_path_ls.add(trace_path); + MessageTracedLink trace_path = new MessageTracedLink(); + trace_path.identifiers.add(Triple.createTriple(attri_clsCode.getLeft(), md.getDeclarationAsString().trim(), attri_name_sim * sim)); + msg_inSD.traced_link_ls.add(trace_path); } } System.out.println("检查完支撑类" + clsCode_unit.getNameAsString() + "中属性" + sim_attri.getVariable(0).getNameAsString() + "的类型实现类中所有方法与" + msg + "的相似度了"); @@ -675,10 +686,10 @@ public class CodeMessageTracer { */ // 这个阈值可以再改 if (parameter_sim > 0.3 || codeLine_sim > 0.3) { - TracedMessagePath trace_path = new TracedMessagePath(); + MessageTracedLink trace_path = new MessageTracedLink(); double max = parameter_sim > codeLine_sim ? parameter_sim : codeLine_sim; - trace_path.path.add(Triple.createTriple(uo_mapped_file_dir, tri.getMid().trim(), tri.getRight() * max)); - msg_inSD.traced_path_ls.add(trace_path); + trace_path.identifiers.add(Triple.createTriple(uo_mapped_file_dir, tri.getMid().trim(), tri.getRight() * max)); + msg_inSD.traced_link_ls.add(trace_path); } } @@ -690,9 +701,9 @@ public class CodeMessageTracer { double returnType_sim = jaccard_similarity(md.getTypeAsString(), target_title); // 这个阈值可以再改 if (returnType_sim > 0.5) { - TracedMessagePath trace_path = new TracedMessagePath(); - trace_path.path.add(Triple.createTriple(uo_mapped_file_dir, tri.getMid().trim(), tri.getRight() * returnType_sim)); - msg_inSD.traced_path_ls.add(trace_path); + MessageTracedLink trace_path = new MessageTracedLink(); + trace_path.identifiers.add(Triple.createTriple(uo_mapped_file_dir, tri.getMid().trim(), tri.getRight() * returnType_sim)); + msg_inSD.traced_link_ls.add(trace_path); } } @@ -849,7 +860,7 @@ public class CodeMessageTracer { */ System.out.println("对于" + msg_inSD.msg + ",将由标识符链接起来的链条作为消息的追踪"); // 按照identifier的顺序保存多个traced_path - List temp_tracedPath_startingFromID = new ArrayList<>(); + List temp_tracedPath_startingFromID = new ArrayList<>(); int traced_identifiers_num = index_clsFilePath_ls.size(); int id_index = 0; do { @@ -857,22 +868,22 @@ public class CodeMessageTracer { if (id_index == 0) { List, ClassOrInterfaceDeclaration>> tracedFiles_for_firstIdentifier = index_clsFilePath_ls.get(id_index); for (Triple, ClassOrInterfaceDeclaration> a_tracedFile_for_firstIdentifier : tracedFiles_for_firstIdentifier) { - TracedMessagePath traced_path = new TracedMessagePath(); - traced_path.path.add(a_tracedFile_for_firstIdentifier.getMid()); + MessageTracedLink traced_path = new MessageTracedLink(); + traced_path.identifiers.add(a_tracedFile_for_firstIdentifier.getMid()); temp_tracedPath_startingFromID.add(traced_path); } } // 后面标识符的每个追踪文件都得在前面的一个TracedMessagePath后出现一次 else { int temp_tracedPath_currentSize = temp_tracedPath_startingFromID.size(); - List tmp_record_tracedPath = new ArrayList<>(); + List tmp_record_tracedPath = new ArrayList<>(); for (int j = 0; j < temp_tracedPath_currentSize; j++) { - TracedMessagePath Jth_tracedPath_till_formerID = temp_tracedPath_startingFromID.get(j); + MessageTracedLink Jth_tracedPath_till_formerID = temp_tracedPath_startingFromID.get(j); List, ClassOrInterfaceDeclaration>> tracedFiles_for_currentIdentifier = index_clsFilePath_ls.get(id_index); for (Triple, ClassOrInterfaceDeclaration> a_tracedFile_for_currentIdentifier : tracedFiles_for_currentIdentifier) { - TracedMessagePath new_ttp = new TracedMessagePath(); - new_ttp.path.addAll(Jth_tracedPath_till_formerID.path); - new_ttp.path.add(a_tracedFile_for_currentIdentifier.getMid()); + MessageTracedLink new_ttp = new MessageTracedLink(); + new_ttp.identifiers.addAll(Jth_tracedPath_till_formerID.identifiers); + new_ttp.identifiers.add(a_tracedFile_for_currentIdentifier.getMid()); tmp_record_tracedPath.add(new_ttp); } } @@ -881,7 +892,7 @@ public class CodeMessageTracer { } id_index++; } while (id_index < traced_identifiers_num); - msg_inSD.traced_path_ls.addAll(temp_tracedPath_startingFromID); + msg_inSD.traced_link_ls.addAll(temp_tracedPath_startingFromID); /* * 3)对比链条两端与消息两端的对象。如果存在支撑类之类的关系,则认为消息两端应该是支撑类;否则仍保留链条两端作为消息两端。 * @@ -1063,17 +1074,127 @@ public class CodeMessageTracer { * 整理、保存追踪结果 */ public static void save(List trace_msgs, String res_dir) { + System.out.println("开始整理结果"); for (Message msg : trace_msgs) { - int tracing_ways = msg.traced_path_ls.size(); - for (int i = 0; i < tracing_ways; i++) { - TracedMessagePath tracing_way = msg.traced_path_ls.get(i); - System.out.println(msg.msg + "的第" + (i + 1) + "种追踪链:"); - int identifier_num = tracing_way.path.size(); - for (int j = 0; j < identifier_num; j++) { - Triple traced_file = tracing_way.path.get(j); - System.out.println("\t" + msg.msg + "的第" + (j + 1) + "个标识符有" + traced_file.getRight() + "概率追踪到文件" + traced_file.getLeft() + "的代码段" + traced_file.getMid()); + // 整理后的结果 + List res = new ArrayList<>(); + // 该Map临时对比用:以追踪文件地址为Key,各种不同代码段对应的tracing_way为List + Map> tracedFiles_waysForThisFile = new HashMap<>(); + // 遍历该msg的所有追踪链 + for (MessageTracedLink trace_link : msg.traced_link_ls) { + // 如果追踪链里只有一个标识符,则进行合并 + if (trace_link.identifiers.size() == 1) { + // 当前追踪链里、唯一一个标识符的一个追踪文件 + Triple traced_file = trace_link.identifiers.get(0); + /* + * 如果Map里暂时还没有记录这个追踪文件(traced_file.getLeft()),则记录该追踪文件及对应的追踪链 + */ + if (!tracedFiles_waysForThisFile.containsKey(traced_file.getLeft())) { + List tracingWays_for_this_tracedFile = new ArrayList<>(); + tracingWays_for_this_tracedFile.add(trace_link); + tracedFiles_waysForThisFile.put(traced_file.getLeft(), tracingWays_for_this_tracedFile); + } + /* + * 如果Map里已记录这个追踪文件(traced_file.getLeft()),则对比当前追踪链和已有的代码段是否重复 + */ + else { + // 该追踪文件所拥有的各种不同的追踪代码段 + List tracingWays_for_this_tracedFile = tracedFiles_waysForThisFile.get(traced_file.getLeft()); + boolean already_have_this_code = false; + // 对每个已追踪到的代码段,与traced_file.getMid()对比。若一样,则合并概率 + int traced_codes_num = tracingWays_for_this_tracedFile.size(); + for (int i = 0; i < traced_codes_num; i++) { + MessageTracedLink traced_code = tracingWays_for_this_tracedFile.get(i); + // 如果已经追到过这段代码(该段代码被重复追踪了),则合并概率 + if (traced_code.identifiers.get(0).getMid().equals(traced_file.getMid())) { + already_have_this_code = true; + // 概率合并 + double p = 1 - (1 - traced_code.identifiers.get(0).getRight()) * (1 - traced_file.getRight()); + traced_code.identifiers.get(0).setRight(p); + tracingWays_for_this_tracedFile.set(i, traced_code); + } + } + // 若该段代码是新的,则直接添加进Map即可 + if (!already_have_this_code) { + tracingWays_for_this_tracedFile.add(trace_link); + } + tracedFiles_waysForThisFile.put(traced_file.getLeft(), tracingWays_for_this_tracedFile); + } + } + // 如果追踪链里有多个标识符,则该消息是复杂消息,追踪结果不可能有重复,所以不用合并 + else { + res.add(trace_link); + } + } + Collection> tracedCodes_for_tracedFiles = tracedFiles_waysForThisFile.values(); + for (List tracedCodes_for_tracedFile : tracedCodes_for_tracedFiles) { + res.addAll(tracedCodes_for_tracedFile); + } + msg.traced_link_ls = res; + } + System.out.println("完成整理结果"); + System.out.println("保存结果至" + res_dir); + try { + WritableWorkbook workbook = Workbook.createWorkbook(new File(res_dir)); + if (workbook != null) { + // 新建第一个工作表 + WritableSheet sheet1 = workbook.createSheet("Sheet1", 0); + /* + * 保存结果了↓ + * + * 保存结果了↓ + * + * 保存结果了↓ + * + * 保存结果了↓ + * + * 保存结果了↓ + * + * 保存结果了↓ + * + * 保存结果了↓ + */ + // 构建工作表的表头 + sheet1.addCell(new Label(0, 0, "类")); + int row = 10; + sheet1.addCell(new Label(0, row, "类")); + for (Message msg : trace_msgs) { + int tracing_ways = msg.traced_link_ls.size(); + for (int i = 0; i < tracing_ways; i++) { + MessageTracedLink tracing_way = msg.traced_link_ls.get(i); + System.out.println(msg.msg + "的第" + (i + 1) + "种追踪链:"); + int identifier_num = tracing_way.identifiers.size(); + for (int j = 0; j < identifier_num; j++) { + Triple traced_file = tracing_way.identifiers.get(j); + System.out.println("\t" + msg.msg + "的第" + (j + 1) + "个标识符有" + traced_file.getRight() + "概率追踪到文件" + traced_file.getLeft() + "的代码段" + traced_file.getMid()); + } + } } + /* + * 保存完结果了↑ + * + * 保存完结果了↑ + * + * 保存完结果了↑ + * + * 保存完结果了↑ + * + * 保存完结果了↑ + * + * 保存完结果了↑ + * + * 保存完结果了↑ + */ + // 写入文件 + workbook.write(); + workbook.close(); } + } catch (RowsExceededException e) { + e.printStackTrace(); + } catch (WriteException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); } } } diff --git a/src/main/java/com/hy/java/uct/sdtocode/util/TracedMessagePath.java b/src/main/java/com/hy/java/uct/sdtocode/util/MessageTracedLink.java similarity index 80% rename from src/main/java/com/hy/java/uct/sdtocode/util/TracedMessagePath.java rename to src/main/java/com/hy/java/uct/sdtocode/util/MessageTracedLink.java index 127b5e2..e377b09 100644 --- a/src/main/java/com/hy/java/uct/sdtocode/util/TracedMessagePath.java +++ b/src/main/java/com/hy/java/uct/sdtocode/util/MessageTracedLink.java @@ -12,9 +12,9 @@ import com.hy.java.utility.common.Triple; * * 每条链路有个总体的追踪概率 */ -public class TracedMessagePath { +public class MessageTracedLink { /** * 一条链路:由一系列{@code }组成的List */ - public List> path = new ArrayList<>(); + public List> identifiers = new ArrayList<>(); } diff --git a/src/main/java/com/hy/java/uct/util/sd/Message.java b/src/main/java/com/hy/java/uct/util/sd/Message.java index 75f939e..1b30ca6 100644 --- a/src/main/java/com/hy/java/uct/util/sd/Message.java +++ b/src/main/java/com/hy/java/uct/util/sd/Message.java @@ -3,7 +3,7 @@ package com.hy.java.uct.util.sd; import java.util.ArrayList; import java.util.List; -import com.hy.java.uct.sdtocode.util.TracedMessagePath; +import com.hy.java.uct.sdtocode.util.MessageTracedLink; import com.hy.java.uct.umlrecog.util.Line; import com.hy.java.uct.umlrecog.util.PolygonalLine; @@ -37,7 +37,7 @@ public class Message { * * 每条链路有个总体的追踪概率 */ - public List traced_path_ls = new ArrayList<>(); + public List traced_link_ls = new ArrayList<>(); public Message() { } diff --git a/src/main/resources/sdtocode/Hadoop HDFS.xls b/src/main/resources/sdtocode/Hadoop HDFS.xls new file mode 100644 index 0000000000000000000000000000000000000000..9d426080e60c7dc410267c216f95e276f624c02c GIT binary patch literal 13824 zcmeHO%}Z2K6#v~fAI@m%%=l3W!NUkj2SFDhQGSFj3<61_7DA0?7+Qvy6bVgVyMmx? z8<#Dj+SDc@cP)aVP2g&b{sDt_+Us}D__7ZNCdjBb=W##Y@1Fb4xxahv%;wxTuhWJ3 z$4yK4LAnsZ=OBsrH@IVed-$FL$Ads#!*(0{giQV+29gPGWITqC4X-L>FJ-@%;Nekp zfi>`+WfvlRx2iy(m)oNFZ%GAJ;aMk7`?&uh15GXj`9;1t;|k++ERS=^~j|4^C={-a)0^l;gP}a6N2(m7_b_@&MMXb>6aFn_Uz^hS6Je6ev36DQw+SmUh1qGA!I@(pC;;JH` zS0eHz8pXGF{Bj@P>iHwnX8(fH7bU z7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8( zfH7bU7z2Nf0ZE^g{BTKZl_Xte{puY6xeOrpIwUDqvRozER#J$oStR{dl4fN*%{IeQ z#}X#?HnP8!MaEZIq&4|F890I|J~Qyqk8^CNafv%uzBDpo!j(xZl_L@lq24iCpT-16 z)Q^b}F1wYRAQHQw4`oj*W{lJOAzZ*&J~>_c09iP#J_$0z`yW$8O3QBAmvx6el-67y jVG29&)qWo>jH(Y~x&y!FPbck%YnOK2O6i`OUbFuNKwxog literal 0 HcmV?d00001 -- Gitee From 2db5a1f44133b6575da2dc4de301738ef7c8d79a Mon Sep 17 00:00:00 2001 From: chief Date: Sun, 22 May 2022 22:00:12 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=B7=B2=E5=81=9A=E5=AE=8C=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E3=80=82=E5=B7=B2=E5=BE=97=E5=88=B0=E5=8E=9F=E5=A7=8B?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E3=80=82MapReduce=E5=87=BA=E7=8E=B0.cc?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8C=E9=9C=80=E8=A6=81=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hy/java/uct/sdtocode/SDToCodeTracer.java | 19 +++--- .../sdtocode/mapper/CodeMessageTracer.java | 55 ++++++------------ src/main/resources/sdtocode/Hadoop HDFS1.xls | Bin 0 -> 66048 bytes src/main/resources/sdtocode/Hadoop HDFS2.xls | Bin 0 -> 26112 bytes .../{Hadoop HDFS.xls => Hadoop MapReduce.xls} | Bin 13824 -> 13824 bytes 5 files changed, 28 insertions(+), 46 deletions(-) create mode 100644 src/main/resources/sdtocode/Hadoop HDFS1.xls create mode 100644 src/main/resources/sdtocode/Hadoop HDFS2.xls rename src/main/resources/sdtocode/{Hadoop HDFS.xls => Hadoop MapReduce.xls} (95%) diff --git a/src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java b/src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java index cdfdd34..8b65499 100644 --- a/src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java +++ b/src/main/java/com/hy/java/uct/sdtocode/SDToCodeTracer.java @@ -50,9 +50,9 @@ public class SDToCodeTracer { */ // Hadoop HDFS // Pair, List> objs_in_SD = SDReader.read(sd_dir + "sd-Hadoop HDFS1.txt"); - Pair, List> objs_in_SD = SDReader.read(sd_dir + "sd-Hadoop HDFS2.txt"); + // Pair, List> objs_in_SD = SDReader.read(sd_dir + "sd-Hadoop HDFS2.txt"); // Hadoop MapReduce - // Pair, List> objs_in_SD = SDReader.read(sd_dir + "sd-Hadoop MapReduce.txt"); + Pair, List> objs_in_SD = SDReader.read(sd_dir + "sd-Hadoop MapReduce.txt"); // 检查结果,可注释掉 // SDReader.check(objs_in_SD); /* @@ -61,17 +61,17 @@ public class SDToCodeTracer { * 将对象分解 */ // Hadoop HDFS - DocReader.readDoc(doc_dir + "Hadoop HDFS\\Hadoop HDFS.xls", objs_in_SD); + // DocReader.readDoc(doc_dir + "Hadoop HDFS\\Hadoop HDFS.xls", objs_in_SD); // Hadoop MapReduce - // DocReader.readDoc(doc_dir + "Hadoop MapReduce\\Hadoop MapReduce.xls", objs_in_SD); + DocReader.readDoc(doc_dir + "Hadoop MapReduce\\Hadoop MapReduce.xls", objs_in_SD); // DocReader.check(objs_in_SD); /* * 3、读取code path指定的目录下所有java文件 * * <类全称(包+类名), java_file_path> */ - Map classFullName_javaFileDir_map = CodeReader.read(code_dir + "code path-hdfs"); - // Map classFullName_javaFileDir_map = CodeReader.read(code_dir + "code path-mr"); + // Map classFullName_javaFileDir_map = CodeReader.read(code_dir + "code path-hdfs"); + Map classFullName_javaFileDir_map = CodeReader.read(code_dir + "code path-mr"); // 检查结果,可注释掉 // CodeReader.check(classFullName_javaFileDir_map); /* @@ -88,10 +88,9 @@ public class SDToCodeTracer { */ List traced_msgs = CodeMessageTracer.trace(objs_in_SD, classFullName_javaFileDir_map); // Hadoop HDFS - CodeMessageTracer.save(traced_msgs, res_dir + "Hadoop HDFS.xls"); + // CodeMessageTracer.save(traced_msgs, res_dir + "Hadoop HDFS1.xls"); + // CodeMessageTracer.save(traced_msgs, res_dir + "Hadoop HDFS2.xls"); // Hadoop MapReduce - // CodeRelationMapper.save(traced_msgs, res_dir + "Hadoop MapReduce.xls"); - // 检查结果,可注释掉 - // CodeRelationMapper.check(res_dir + "Hadoop HDFS.xls"); + CodeMessageTracer.save(traced_msgs, res_dir + "Hadoop MapReduce.xls"); } } diff --git a/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java b/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java index e16fabb..c0fdc14 100644 --- a/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java +++ b/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java @@ -1073,9 +1073,9 @@ public class CodeMessageTracer { /** * 整理、保存追踪结果 */ - public static void save(List trace_msgs, String res_dir) { + public static void save(List traced_msgs, String res_dir) { System.out.println("开始整理结果"); - for (Message msg : trace_msgs) { + for (Message msg : traced_msgs) { // 整理后的结果 List res = new ArrayList<>(); // 该Map临时对比用:以追踪文件地址为Key,各种不同代码段对应的tracing_way为List @@ -1140,51 +1140,34 @@ public class CodeMessageTracer { // 新建第一个工作表 WritableSheet sheet1 = workbook.createSheet("Sheet1", 0); /* - * 保存结果了↓ - * - * 保存结果了↓ - * - * 保存结果了↓ - * - * 保存结果了↓ - * - * 保存结果了↓ - * - * 保存结果了↓ - * - * 保存结果了↓ + * 保存结果 */ // 构建工作表的表头 - sheet1.addCell(new Label(0, 0, "类")); - int row = 10; - sheet1.addCell(new Label(0, row, "类")); - for (Message msg : trace_msgs) { + sheet1.addCell(new Label(0, 0, "消息")); + sheet1.addCell(new Label(1, 0, "标签索引")); + sheet1.addCell(new Label(2, 0, "Java文件地址")); + sheet1.addCell(new Label(3, 0, "代码段")); + sheet1.addCell(new Label(4, 0, "追踪概率")); + // 保存追踪链 + int msg_num = traced_msgs.size(); + int row = 1; + for (int msg_index = 0; msg_index < msg_num; msg_index++) { + Message msg = traced_msgs.get(msg_index); int tracing_ways = msg.traced_link_ls.size(); for (int i = 0; i < tracing_ways; i++) { MessageTracedLink tracing_way = msg.traced_link_ls.get(i); - System.out.println(msg.msg + "的第" + (i + 1) + "种追踪链:"); int identifier_num = tracing_way.identifiers.size(); for (int j = 0; j < identifier_num; j++) { Triple traced_file = tracing_way.identifiers.get(j); - System.out.println("\t" + msg.msg + "的第" + (j + 1) + "个标识符有" + traced_file.getRight() + "概率追踪到文件" + traced_file.getLeft() + "的代码段" + traced_file.getMid()); + sheet1.addCell(new Label(0, row, msg.msg)); + sheet1.addCell(new Label(1, row, String.valueOf(j + 1))); + sheet1.addCell(new Label(2, row, traced_file.getLeft())); + sheet1.addCell(new Label(3, row, traced_file.getMid())); + sheet1.addCell(new Label(4, row, String.valueOf(traced_file.getRight()))); + row++; } } } - /* - * 保存完结果了↑ - * - * 保存完结果了↑ - * - * 保存完结果了↑ - * - * 保存完结果了↑ - * - * 保存完结果了↑ - * - * 保存完结果了↑ - * - * 保存完结果了↑ - */ // 写入文件 workbook.write(); workbook.close(); diff --git a/src/main/resources/sdtocode/Hadoop HDFS1.xls b/src/main/resources/sdtocode/Hadoop HDFS1.xls new file mode 100644 index 0000000000000000000000000000000000000000..e0f4f87442afc3ed4830f23bdfde7b06f40ac324 GIT binary patch literal 66048 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/sdtocode/Hadoop HDFS.xls b/src/main/resources/sdtocode/Hadoop MapReduce.xls similarity index 95% rename from src/main/resources/sdtocode/Hadoop HDFS.xls rename to src/main/resources/sdtocode/Hadoop MapReduce.xls index 9d426080e60c7dc410267c216f95e276f624c02c..901e0a7df19b42a59e6179048e71d8d62c3b7858 100644 GIT binary patch delta 333 zcmZq3X~@~2!NkeT!00h;XR5saW<#b%=6Y8a1|VQ#3}(n+NCmo-C;HP6{|WYBap`k zw6b`z6x+gj5D(%44kiI8`#+cln#%B(feXy$2a^yUBLhE33M$70_u9ejB=PbCTuT%^f>nh Date: Mon, 23 May 2022 12:20:36 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=96=B9=E6=B3=95=E5=B7=B2=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E5=AE=8C=E6=88=90=E3=80=82=E5=AE=9E=E9=AA=8C=E5=B7=B2?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=E3=80=82=E6=95=B4=E7=90=86?= =?UTF-8?q?=E4=B8=80=E4=B8=8B=E5=AE=9E=E9=AA=8C=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdtocode/mapper/CodeMessageTracer.java | 45 ++++++++++++++++-- .../resources/sdtocode/Hadoop MapReduce.xls | Bin 13824 -> 69120 bytes .../doc/Hadoop MapReduce/Hadoop MapReduce.xls | Bin 52736 -> 54272 bytes 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java b/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java index c0fdc14..1099b02 100644 --- a/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java +++ b/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java @@ -507,9 +507,9 @@ public class CodeMessageTracer { * 2)计算每个方法与消息内容的语义相似度。找到相似的方法。 */ for (Triple tri : method_code_sim) { - double sim = jaccard_similarity(tri.getLeft().getNameAsString(), method_in_msg); + double sim = jaccard_similarity(tri.getLeft().getNameAsString().toLowerCase(), method_in_msg.toLowerCase()); // 这个阈值可以再改 - if (sim > 0.5) { + if (sim >= 0.5) { tri.setRight(sim); } } @@ -519,7 +519,7 @@ public class CodeMessageTracer { * ②对与消息相似的方法,找到其所属的类,在这个类里看该方法的返回类型是否与另一端相似。 */ for (Triple tri : method_code_sim) { - if (tri.getRight() > 0.5) { + if (tri.getRight() >= 0.5) { // ①找该方法内是否有对消息另一端的调用,如参数、方法内的变量、语句等。 checkIfCall(tri, target_uo.getTitle(), msg_inSD, uo_mapped_file_dir); // ②对与消息相似的方法,找到其所属的类,在这个类里看该方法的返回类型是否与另一端相似。 @@ -640,12 +640,17 @@ public class CodeMessageTracer { for (MethodDeclaration _method : methods) { res.add(Triple.createTriple(_method, _method.getDeclarationAsString(), 0.0)); } - for (Pair method_in_codeLine : methods_in_codeLine) { - for (MethodDeclaration method_in_importAndPackage : methods_in_importAndPackage) { + for (MethodDeclaration method_in_importAndPackage : methods_in_importAndPackage) { + boolean used_in_methods = false; + for (Pair method_in_codeLine : methods_in_codeLine) { if (method_in_codeLine.getRight().equals(method_in_importAndPackage.getNameAsString())) { res.add(Triple.createTriple(method_in_importAndPackage, method_in_codeLine.getLeft(), 0.0)); + used_in_methods = true; } } + if (!used_in_methods) { + res.add(Triple.createTriple(method_in_importAndPackage, method_in_importAndPackage.toString(), 0.0)); + } } return res; } @@ -698,9 +703,39 @@ public class CodeMessageTracer { */ private static void checkIfReturn(Triple tri, String target_title, Message msg_inSD, String uo_mapped_file_dir) { MethodDeclaration md = tri.getLeft(); + String return_type = md.getTypeAsString(); + if (return_type.contains(".")) { + return_type = return_type.substring(return_type.lastIndexOf(".") + 1); + } + boolean return_similar = false; + // 看返回类型是否与另一端相似 double returnType_sim = jaccard_similarity(md.getTypeAsString(), target_title); // 这个阈值可以再改 if (returnType_sim > 0.5) { + return_similar = true; + } + /* + * 另一种情况:对比返回消息中的返回类型 + * + * 对于返回类型为org.xxx.JobID和对应返回消息jobId这种类型的识别 + */ + else { + if (msg_inSD.return_msg != null) { + returnType_sim = jaccard_similarity(return_type.toLowerCase(), msg_inSD.return_msg.msg.toLowerCase()); + if (returnType_sim > 0.5) { + return_similar = true; + } + } + } + // 如果返回类型不像,但名称过于相似,则也认为是追踪 + if (!return_similar) { + String msg_pure_methodName = msg_inSD.msg.substring(0, msg_inSD.msg.lastIndexOf("(")); + returnType_sim = jaccard_similarity(md.getNameAsString().toLowerCase(), msg_pure_methodName.toLowerCase()); + if (returnType_sim >= 0.75) { + return_similar = true; + } + } + if (return_similar) { MessageTracedLink trace_path = new MessageTracedLink(); trace_path.identifiers.add(Triple.createTriple(uo_mapped_file_dir, tri.getMid().trim(), tri.getRight() * returnType_sim)); msg_inSD.traced_link_ls.add(trace_path); diff --git a/src/main/resources/sdtocode/Hadoop MapReduce.xls b/src/main/resources/sdtocode/Hadoop MapReduce.xls index 901e0a7df19b42a59e6179048e71d8d62c3b7858..39772bdf0f296aa2fcf2323db9edcd5ee9d0fe29 100644 GIT binary patch literal 69120 zcmeIb3v^t`bsc&E{=gZ{a5(=j=MLt>1_?It$(?DMUO*Xor z?gmL{1ZgbWk!{JcHIgMqn)e*PSSvq2+p=uSUeAu?tVHq38s)d_C)-a+oXE*?;yfo- z5@*HB65rmZs%}-?zTLz~GqU}R=DJ|tx>dVQojP^u)TvXq|M@@L{d+(8xd;DkkoX)A zwglh0u`}52q_^Vx_nZ4W0zAKQgSY1Y@5T4;!-eF{&tDP_>}*3vZr>Ix^n7KCKpI+}`Q)!ek4}c)ozE$uA=g40zSI%~$MCHscpa&` zg9n7NJLT_P^7m&Y->=HwW5J!lQp@cv7oYz7j~_wl0Oj75V8zqjLWOYj9L z^ShGL9XuHP2J+wdz>lIvCT(jO3MxS%$OXmV?RNUqhSHaJ~lI-GQ{r!)N;44blf2q#sXBZwXGM&`)~$Qqu#Zr_s|A>}-(# zmb(1S`|IxDYv{!L>Pj)aC1`6<%g)sN0rJ;V`wQTnmX?^Sd$!&mYzyuRg7(k0Ki>KH z<6Q&za`AwC-Lv%(Xw>_iXBVcU{7Y_zJ;4qLcw9K!<(9|Yo~@6Als$fq1d3!k9PA5v zg5XjJ^nIaJe<>W$x0)WC(0-s@Zcbhb_iW7u9r%Z$Zn=G-TWDYCl{gV}22cByfd~t) zi+X7QIB~*OdMMbBF=i_@dE=?M1(cdq2?AiJ#`2C>!RG8&u z3BmD);w-Gk!N4tHo&-pk$m1hP#^1we;^%+dK;}P_ulVz&km*z^Z$&zlL>kVP2I)vn z&Hw+0^cHr?``8kG6rbO<}yA9HRra}5=8l?YhgY=(n zkp90lNdIty^hWeF!vDPBV5}tg^S?JpSM=29SM=1U|5O8<&oxN@1xcsIPm||uhR*-a zPUJ`RFKtrk-`@E)dJ0&mVUdz`NZzspStx^w+353Dg1#XtM-0kVd0C9e(}*@>lY*)bBsz) z(7(GuIvTF>|7P$qzCtM)y|h1-o)%03X>`{2``;IO>eGLyLHe&WNPn~P^NWImj#ll8 z`|IyX`fVm1{8W5X{CtO#uK29R>76G1_1(Mgz4c!3|I^|7+U^eCM*)gI$Aho`*tT8k zZ3lvNFa2@kXboB@+TB(c57Uw5+!cB?>$t*%}pSZPQ3wkqy%}Cgw1#2YGTM zAU94l2YG5EAU(Z4NV5HV0n)hrt@WhC!T_7tezAIU!3~#Tty}ejFaMW+dZTgsGakt6 z!S-~J8~?Z&2rL(elGmdKl-&5k*Bweemgvqwfb58ybK=C+29&(<*JF?!x``k7zz1%i zcjd!wCqLY@olY7a$>)}owDqWMnw5%s6*4cMJVl*^Uxj8nhqMf$U!{cH?k zWWZ&usmx8=IJ=VrvkPRXfl0YSU->ey-gZ49$;XgwTVTfDjT>*o1q`u2|MNe8Bhald z#7df`*bwWc8QF-_P)ofQJ?Ih3?)Esi-gZ7g>^>CO8mnEJ*j@or%)ZdNONiwklZG)T z#MY~)K9o}GsbOCl5U3{st_R`NZ9(d&BagQP(Sl1|JqYdAn}WPC)*R$v4+J+ppA;pr zj&IPM{*8c8cx1|I07CQRrp<{KnuFZ85s){=nu9#zf#4>cC(S_)Z3F~9He_ooCp0}a zz?0@6@GIOL_7bS7t-s!zj?iB^1Qccy{zx&Bgq}RKrdA(`!oM~FGE6+W> z|M07yNw4?O=Jlq@b7#|fU3u>5{oLR9$LaNk&Ff8*=dPypy7Ju9``TB&mR|2;&Ff8* z=f0-(y7Ju9`=?+0k+gcZ2JNqIyYX7v!%+W_IQ?naw(Z82;Qd#(Pygl>CVjkhXYe@O z1}!_5e*DK@YuoQ<-m>dPYrrS;EQoD^rSPMp>ms`?A8)-acmgYKDXZ+4V~O&2+}JAR z`IKWJiP5?PyxD;j?d13T8X7^wCoLi+KZ&?IMpRPX0P)6&zx73$2Sj|zB2uQ4h>e?bQH1{9pngK&Ksf_donW0j8IX~)#etV!Ydh;#x8(s;$0u~Y2=83`bGy^OEm#QJ-rf${wg&rO-CEy* zZCe4k_lH~Fty-`(=zMhta)o}y+jf9d=DGlt4SwN6X+A(ofAYhhdgZmYvR|O}UcmAR zSERIV$WMA7O^fLb6yB0*KBQktQEl(qyk|STyN|c-3bJ5A%a@k^{o?tV;pYaIUTa%T zP;npXv(H^x=xGxUqABqVVQ8VtZM$%gw5U5ni@Gzks5{bfkhFaL2mi^(_P+d~sB`hP zHm)&*Q}U;!wIB7_=SEgdW3`;!2L57{FMRmitU^i1d+V)`ck|T60G&pHc0mDvmT!IH zv-5^8Cla*W4_fSVqb*2F+%J?LCeS;p@;`W4!+53u!-8*O##I5VQGV#BHoWW;^?@z#5S{(5}s zyCnW&b@=Y=j;+0^@p_pd{-Jt&YQH4@lXdv+EFJ`(`M+LF$3I+;PhFVA@2JCfXKQG% z{Qr@Tf21Ctnlg!hpbp=im4o2fpZ;<>{?U4T&csRl?mB#T_6>sn`N=bB_&X6M13lFG zqX#BlYdZ{F8F2EarR8DhAwDs3A|j1VC!>d6$Ig@k-h%r1gq~=l&$*3ZR3^6|Y;)C}X|B36%~f|FZF^_%QKzSV6#cau z|7I~2&LK1~3TA>@uqNNeahFHP;A*f856u+5T@A{3YIBSsZ82CvS~mvc%MyV2{b27W zf01IaJ(yXFqFVQ-+wKoO?bN9z&j8M%Ao!aI+Wec&GnV@ZRPpop_vUMSn8U^}@*);57RBM9cMGyn<}s z{E>Yh{b1okRqUcKMzx9P+PU)FXg<>c?Cwtm!Re&8uUtG==N*6EZuI4V5D~lI% zE4le4gNA1s?ILKJS)Eh0XPLWYOK@=CzT0j==-Sz+7G5sTg@CL?)s=E7UnnhxwK5Y6 z`7HBDzLP7tN^Y5{qj{B3iE68rQdpk59L?9l@Fpm%xq6>Pjujdl?SicFW4@T(K}us1R($e;Hh(r&aYGVLfnXIGTbMzJdzz zLE)KNuC`hYtLndFq2h2>p{s|P%WPc7fGSg12s1kOW5>eMYO&a1;56iLxwHVjl@@df zCf6!!ZZ0MQ z)hb8|3neh1G#{aFN#sPicBZ^qvYk~&3t_ZakYNsA_+&kdiq$B|9zK!&1j)$)mOx6B z{^$z8OVT>3Y0T7?3e`^Czn#K#!%|(=Cu|+|e^<8mPqa3-|4}HyTCRE}%t7@ouhhc1s8}v7 zlJRef5Mqqx^@t^*BW94Z_QtJ|#k1hy#E`ljdv!$yT+AN>n7`N*7eIta8@ z|Bj>^_OIsCd~vmk2}Bf@OqZDs-9Hrd)oR8{RmT8!V!N_Oj~?km6jOCBn_F3lO8HDX z#P8{_y~Er?-Jzh<%kh);i>3CCf$^JFJ_|7!j>q}PRZQYlU)xi5I>WBcu)C{c;KWAo zrlXZ|1u(WbondWxWp-^P>KMobK^h;fKyRUKPMMAY7|dx|G5nEps!}Ld3bi$-gql(p z!QonYrdEMjkU_O3BPJ|FfRd;99PaBozmcZYvBqr^m|v-#sg##HG21RH-gOLMy>Qe1 z9>%Oh!^$DPV*q>FXqT}WFag`T24M64`CDc*%Z5d8Wqd$=u2c$Fp{=PUHMQrfVEeEV z^bDr%T#*k|qYC+r8$xQb>p>_-Ju?AF%Lj03l=L6%>U$#2sJN!guk1p(GLc)3boP#c z)2*PnT!Z}=BEOR;ZAZG`3YHUwH><%C5wtqhy zPZ+tmY7J&rEu4<9Ov%3hMHN*BpY05vKTe5rQ!_MFXVx$=EQf`~64puiP7WEG-L%3w zL#4{X66CluoT`);vFxel=3qKQl;tLESPk4sW!KZw*V}&t>Q4RTFafq$cSgT>BUTTq zcAYI&Ldi^Ab!-5O*$^OuD%A{US2J-^HebG0TCC*qGDz9kdNPE*mL?qOK79CaSAYNE zoJ)Z5dWh2T1wa#Au94bB-4uz|=LJ>xfEau9kt5KyU%XD;DSXt%5vKDcrpyrh#Rxzch z3WJ>w;GNJD-efVa{61K%&#*}5CW6OIurejD3}L%w(_CN$5eM({T+yk;hAg^zdb+#% zdk*z>_a8oTwC`~5Aw&XOUx}6IRGCl>Qz^1c|$xSA4+JIRzT+T=HP>1}h+(a7D$wN~eS>iHs zPsQn_WG5ykMs#6XD5%}!P?QS=@mMF-;8X0+xkASd80FMM(am$6t3S>oO~Op{p4A9G z1~xOvGIeiAKvP-9aL{7VIJi=JC@jD`+O%Un@4SJ~(KSyovolvK(EtSJA1YS04gU=g)=iG{@> z=n^YUMEKcgO)&sV(JH*S(&~&End}`kS~WWorA2=Kkmycp6KTQJ3X1L7 zxcX2Nl$8nB4{(jfTuOVwE76+OK*qII@Ax$;LyI{1ZC3MwpnPJQdS*gbr&BUtEW_)m zR@-p!Rb<&6Rnn}%v`STRBT%{~`45$^e|cMQauO3v1&fk+9``tSY7LW(>DSKCyWLd4 zQ2nmzakP>sgLv#aZf7UYUt9%Tr|BM9L&QCM?S272D8&m;z6x)Qr4 z>eM49oD)TuNK<+d^IUR^E~(obg0irAqFQE7m34F~)tptl)46LI*2zgsYSkW3lV*Gk zoo-`Y#YwpOYGn(~sr1iBk^k7%RP*_}>Wna5v}q=Pm(1kF!5|ESq-naTs-dA=^_y*` zsvB6fO$=5Vq23DVOFdKdb}Mf zyN=;WZOt3U7V}|R+4%Ns>aOUibe9C&KSpoqYSpGfN0@Zc&|a1ei=&5bYl}BU=o5j{ zrMgy{$DCCvyceD`+lRAd*>d2jETi3H#qy%rZRiZm7I~pM%&qd(m1br=^y+LmRQu=H zI4&<2=IJHE;(B!@Z+t>nZb#Q;@rHSfv#vObVh@EpR&%th(y>}xC{*CY&#Cx}5*8Tb zH+upfSx#bmEpCNc3(q@ zXpGajTF%RnPv%I(uxJFV_|huK%tW9o8l6;YZKVO=ccIl1al;*7C4;r2mhHgGJfrsVhD*O%fUu z$6~N)@fT;%ibloPs%SyO;^1pmWKx-5W93E4*XgL1D-^S1lfx3%f!!Eqh~SQU-1rZ< zCn%Vz`Hst$S)P_18%iucb@h}MZGL#ju0qh1wb#MI*zj@ex2A>ZV35J=kl5Lnv<|)h z1s!t$K8s|gG9sZ`#k)_@+%xQ@Ek_!TEwBXZ)D{x%whE`M7ZmL#pNVSdFD zV_}CN1*G1qf>bVytU{w8LR+L{tM&JraEpZUz;b$beFNJhQeq}Kwacu9%0b2gMy+^v5Zgj`PP_x}OcRdB zd8|;1JfEqu?^zajowVY8wwmdtKJrw2;&0Wq#M$>2R>Tdd-RTbX7(l9pVl+_B^U7Cg zhmq+nEGK}Z&)kF5`w=}Y&R?-*^S}$l_lfb6%R}|vRA;7 zulHw0xYt8;JLE+a{vrww)l^bKGpa$V{V+OAjx{CTH;>&&jrEF;{fUxSm+Vf>evRqr z*gz{|qqR^HFIMTRo5zvq^uywytY)%tDtjQ;`_oXcg@ zgz;d0pq1Ylo~cenmF0qL&4!>%e{Htf(+b8yW_2a>H4CVNLk6Nxy0cw4Ao@1N5SB1q zUWKh*y<*RJs5H4R7UnKG#PU4HQHYy%DKjWR)2}C+s>E(`HmzYNlk@60_Vz9z)L|L_ zcMQd%Dy!-AvKorT(^$zU1YN(^QJMLrTqP`})T+W!j`q2q{>OuWM5045H)ujs*{;L= z{R|7mA&ddMn1>UcJkMxs)f7y3$J9eQ3$z~~E8gnK1(g*8w>sAmBC0RF{B8uvmRHuM zqh*9OlFJw+zqBPDB{SNqq9e|qjn>W-qGJA34x@v5T+QZ)L6_4m2>$1&!7lu~Jd3C_ z7(n8msX^k*3c?4dukk&s;-;`rP+^m1t;?xDJa8pkDObBMbmDK%OYl2zQQIlwjSnR7 zPK8QH_Js@C`Ijz$ma54cE-()(LWu2LR8d8Bcm?ZTU~@<@DDM#)X5-~mE%wYc_ zFb^7F0fD;;jp%dHVxd&x*w)yBn}z)Vcr3i(1F=OxInGINF|LS;)Bz)g##E>ma0&y% zyL$l2$tzUg7C$R^Z&WE$Q;{q9KTp;%aA!%pS)ppwUhLH~h%$!A^4!ec?EGF~o1Bh< zhC?%i#~3d)oanH}G`dymaL%Mr^Ewcgx)8!!grf!)sizL9%Rxd+gvX+eEM-S=1EG$Q z=tnJ0)VUG8WsC<$4LVt&fqhS_Z((?#)EQ=GkckWh1kCZ`T1Wg8Y7*Pr(8h>6V{5Rh zgR>|kLy2jjS}sX$8%k$F_Mg=PZ)JT_NxE^mX<3d9Pplr)1d5Wjkcvn!V2RP=8&TYF zYLsz!a(rrNdT4fX`qJbSkE+bbw9LUIs|5-A??2Sj{~Bh4xsEmSbYEqR(E-RZ5xmS@2c?VdpzyT^G5ZSbIc zP1Hc0fMaWz4dnEm%D#}pNj{xl)p@dhC)pP%V;HFQDG}kUt1o0cGpVQ7rq54Ij82?2 z%R1$apOJ7%*%Rj~LpO^S0D>$FRgq2A1Qkg6y5;DmGI)!XL29q1pE>kZi`5YSZaZUh zVT2Vhh390+Av-Hd=6Mc)$1kb7)k;JLlfg!oXbO)XNz`+i=a~oNYDZ8i#cAWe#I3!Z4)8 zZd^fhGMX;!6=lfvJ;wIs8cZ~fYCf%Uh0iS59^=sm4oQ5F^D@rJsS22v>IF+KJ*QQ( z*(@sLgAxKoF}D@VG0&BKVrtfFK@dgKX_YMJMA0Y`=HTkd zQB~tP>4dpKhbC+{P39TkYNt{~+1&{buaoL>pB@KW7K`@Mg3%11SWbd)Qz}ahhE6F#Pj*e-pKgX&xa;J6oe@oGGEqq>y&GyzoEhQhj&)#$uY z*rHDD*v~`{z)H@As0Bv|X?>6(SJA;Wtk-P??0K%;-Qr~S1iBAOn@7y0t2N88yywwc zZlcj#wK#g!2#M3*aIDIqDCUO^e%0+^E6LNiWR}F!GoJzNKG&Exv17?3e$G#0eg{o( zQRMkux!Cc|0j{p{a1qGP;7q2i4_-5zGn4J4?%3(BP}N_zAsSfv)Tz%1qbU|2>jwoh zYcMCT$0w;mdj!Db=KnH1ibtmL5iINtVN}DyoM%8f#xl^+y>Vo_!P8RATm4o4C%uiq zyDZ_`OF77cjMMpYu?R;@878S{Ms*lok;E={-su2LpkR>c6@_7r_!~rzDen@UZ7Yy` zB_iY(8z=uCQ(}FBC`#XkPfN>%t8rqdFF~hdV)4jR^ORVHy&RvO~!?4HVJ<6NxhB7@^Gzf~V|I{`;)2(r} zT`}u^Xnt&Z_Fc}RPvLpOxDw5dkt-V}GNVB;%PR+DwSheXStervsTfJOmU8eJGzlwT0dt^}PtIV8$>R+#z*2@pRWt3z2!=GYV`*rdJz{`! z*2IQc-(}3`LNEJ(O9BGQ)Qm-r3@EED?9aTPN)GCeywGINQm z8MuzzDTYgld^ESZNbZQ6z}X$ap>iw%L?}>`Xni9Go`+KH^NKg9brnvdWre!UhBUL1m4a=l89a>98vwoGfr2MG3{kBtY29;#<$F_QAa;yMEG)GI)=KM^A`4U`Cr|xccQzQ-DZU#p^(tz z;>Defhc};uoZfD92H2ZuoJmGH2;{hvqoU3wM{?OYAZdYmT9166EsM8FhCV71Bi`ud*aCs9NCs}~xPu(+Sy!&=L;h!EOYHF$B?!gKGjk)A z9ACOJT&BW>7eYX#jVn++&DH^lzN9!&MqsdEC5vr$c#@nJT7mK`NJ;?pQUNDtGwsL^ znmCj+Sy-*eM8IVL=}}rrD03J|kkqQeyzKdAQXh7RwoAaE04Gt8D^q1msB0P4io@8l zT&aJKVMi71%)Yvqyy8RIp{^Kdxr>E+TGkPb%queYvFVlhiSo?q{L;AWUB!8o`_Y=a z#*&xgfFeq|`Z~_5!D4K3vax>OnW?N^dZ~Jv^T$Yul7kbQb%4z5Of#eEXj(q*)<{Vk zB-ZQJ@RfBq;OF@gC$ljp4k=YIRYt|8k6#-l8}W0XYE5bETCRxGh4NOg9Mt1AC_s9T z>3ye8qFdEkbA3e2thsLDG{W(5_e>c?&i5{8i$FOU@DdCT zaSEoNOZycKCmT!XhYiUTZ^0}EY-7e1yv3E%g=@G%&Q z;;J87z!nMJ-|GEOD23C!6a%+iNFA}RscGz>@bxxoeGf+?6aZ!k7+5@M0h13d4Kb?o z;oKV5bP{xf`3{GWOHt*(9CxHJGwqYvSUaU*LBPm4#F|M5)B8 z8GIR}_j5?SplS4UCr?VMO#|jQ&Sp#2cznBW?=&pK2(f> zpkgOm*1>dN=q;2G4x*}hX@oYqselmMuAKaCPV^dYAw1}uYRKgh$4#z?&d9HUH&|6G z?g#_vQrA19^^wZ}(c33{?Tylf+K5K|SbV->Z3{?>icd?8)6xP?;-BY{aqvUi8=Tp+ zU7i`886F!Mnm9jYOxqU`KO~EvID|;_ldUQ|rQQq{Z=%LE811VyFNL`VHjg3%DkYB0 zJW8XAI|ietW0F#Um$6coS1F}pZ>;UmqcfxL!j^e=!xuhr;`*)lX83`Ut<5n!Gf zg9VzEWi7vDY~vjw*YTcZt$e&5-k|C-eXN&((1@0OHc-We=K@gAs-_uJie zZkNlmiRhYs3>|=F5%*%8^%r1g#AJmrm1c#czdjM}O`fr?TM~$dJbbjPyQjCW|B(KI zw_O@ZkEzlm-Q;};Z#TJkjYl12cxi*jFa2_uDNJKzTT^CrAb=*f!qr-W^(ZLES!`+b z&XuG6{YU$|kMtfo)ZNu{xaY`zAHdRb8LU`Hg*bA!%YAo8H)cF?*`-6bM~HCOCmjR7 z(Hf+z=~r=(0vk$E-d)iT&Z^ijxC%#0m}La?I28S#hn$(QL9WDMq+*|g_h@Hh7l6NKQNSmd9_7w18O8T4bAmtQpO^qdA`n0$Fvw8bQCq)`9hxSSGj%z|H}v zDXB$NN7pY%T!5P>A`PMb)BVHZoTG|c>C4n%fDlO0j9SEH+o=qHPj00^jfGagHhN1{ zvSEHB8OYkhieS!^aG4g!H>G92KohJD3(qsSrGkXvhi%93q=u`SV zt2l`SCma{DGA*FLz1OTmIjT4>`)cDRCAr9S4mD#X174W?Y`gg$5;qJ43(oxxe>F-=XgKZ~w2`g|_Neu}sjD^q12}(R_A-G{V9%4nY*K zBU4n*o20QnUPiBP^~*Ivm69*!%bs}kyJNi06iO;?kKCn z!L-7%j_+9r-f9K06Ocj13mKtQ{%&X;d5Jqbn&+p-)MUQ?<@;ifks;1lGaRV84RnHD zF3%y(NJ+Qy8Cg%+;L35g=H-2$tbkh&Tz1hptU+}vb+yj!f$Y;DSUzqB=AQ*@%QKPzZ~40k zA;Z|RGfe`=5#N0ohYcjO+*>c|zJlR-07ty>a~s;#r^(8jt#A`W3paVZhrWQJb-?Lm zc2+uz^#FGWGD4yvCLy#Ub$D^D4zrYgmFQ`PXKQMf@n!=Yyb(^;&?GhJ>p3xa5aKg< za7D?@Nv_c3$2p{9xLCF8Wwc+3uT-J48of+;SOO(#hm&{1N&~6PTGys4QZI{)nv@^& zXrkT05~ZLteYiJc?`@p0jrxb}ZbAc$evsD|(@nr}rla7*N5Y8ms(X%;D?H0#@*8>y zLP&+~J&R`v>_(1HpFuB0bd%4Plf%FZUyI#PwH#s%7l+_m)_RXqj1vlg>cB$gfn(3i zD!#V@?KJYB!u?_U$3fz;16+RoWxj?TAB}K2xsRxshfxa;EKxs|uLgK*E2rLKr74W*@7!CAb5J>TPzlCFfYKY%+IvydVz- zPRyJ?H9k7~%;d~0Y)zT4Sslx}Q_lv951l?e?Lz2Q7!*BuQKt3J)_`DDp?>K*T8b6B zWQdzd5dzgJ5jT9}v*Nvoges4x=xxB!WyEw!rWON=iY)!{V-+^6&VZn#8F9)|_Cg90 z>$OxKoSzw)zBDm3KGGS&GOC=dlvnYFk67i4{HxcL@UdP^Gai<=s+SBg?9#Z7cKwFt zrCMzz3$07H5<=T+2!Vtzt5U_%q`iI>x`qHH@T-E|$n3Rf4*vP;YuVhgEj)5nVIDNJQMoL$;sts1Dp(Jv|xh&?H10%RwSyRlwZ^0WZ9pzOF~ zfR;xqMls|CX9LVn%wTrGZ^4);mid*OkQ(`!7!?Fjp5v(%NvNJtZ|^T5-d~iNbQY#W zgxi75aBC@h!v%;dM5gmMZxDBAlzxI*1ihtJq3e)r`uFchLX}$Avf|>Pbl5J|ZAW zoQ;Gam_b+M#?d9rkr*3H;z#AhP;?Pkas0yBnP<+QIfJ7x&yKu!c4Xqx(AZfnvYr`t z`Ju23n#g^|DR*gXWa8}XGszOMS3rd^3>6n)H`JDv<4A@?q%=r$eCu>pE0ZgOX(L zNQp;P5HoReVRHzi+zeONRuG3RF9t4Dfy4U*9(aU-6Za2m@{s-Y52r7BBBA7;h4@D-X%s6WR*d79N$z10D2NMxCP zTvg`6VVDm~h=NjV%IT`t1Z06#Sg!hH2@yY)A7SWmD5W1?>s9O43%+e|W6V;}sBWwb~< zADflvRGq;khLVk4azQ_iUrvz&&iZ~((PHdgHQF{7TRsaz(6$aul5>Yu=@B+irZfhE zV-n%1L&W&%XF`fgp(B})3$;Daj+c)kRw0*P=D|w63{+{D4G>j>P!z}sg?%m(nb01V ze7o&ApdmA}VcIvZQ)44_T!6x}EceFlbLU6Sk7#>Fi!^^CO;~N8x$PL5=js%)U#pah z+zG_uw}>89(r8V)=j2x`q-7Z)!38nWmZ_D`;7mLGve*-;t%-dknL9&Oet0Z9bb5Sr zVsvH}b{C{$hT3mvzNk$pY?{p%b&_hY-JBo~z#KW^p^cH6*bEgOQ>mz}J%%GwwpFB5_GxANS#|bt<=;ZyQEb?&1wmb&x|xZiOZF3h6X009DysKA))}Ql1mG#aAl>@rVfZzSt7O zQ5d{6Lq;_mVPg){)0vGUPIUe$=D=Wti$^^7@GK=od;`Kf6rvxG_C~HQMv)ryChf=Rq}C zzxYj+ZT(oKQWYre=C3kDhYv$nXsbV-k7+o#d<65X7~^K5e9h4k8k%b#D)EeSs!_DP z`k4+7z}{e|0x!grAKIkJKZ-L1X)^0lQ#C7JPh-c#8<;o&OKpc~H^*o1={g#9o7vS8 zN}Pp8{q8(Fxq-copIyS1I^!{mIfnAE;c2#D>O1coBGbb4Sgo~hB=C^>Nc(-!I(nS= z#txh%Osr*HRuhIbNg%ss1}zhpx3O=?b}EbUBga>`;>A&Mw+II|e&^I>oGJ_{UjG>z zLW}jTSe^^U>n4&MyRRv2+OMwPLliq4WQ1q2CgH>;FCo}xLSE$sArw}`F_@EKnB*i> z7ybtt2l1kuYgtUMlt=}o-xdLCW4vX&dZU22;E;Q@*azV&_W0r=84P-jAnso&WF5U2 zcoO4h{5ve+Hy8gln|T?- z>dHCwbIpb_G+%#B+q)Z(4b*OLTe0s@@9lPDk=;n2CCI1L0S4z7kX=ZA+!W@gTu zAG5-s1wo*`BVhm?i>vV4qaSssHWY2S1jES&SW_BM^{7lUy3gFRmm=R*%*0$$l<`fk z{3dsAqu3DNN`pQS$j*9GQecb-vDcIYIbws6zP=X$M*1hqr_E3QLJLr8!H`1f00y7@ zdY=&iu0`~l$DnU3IFT8@(q())92z&{x)L2gmy?lz(ZBdCPJbk!i{wxM6$f6+!PkkE zq)LrVUkf8`LTysZf}abk^Y%ZBnwLoRaX84(SzOtEl9zj2B7jykU}tke{LG)QwK zy3SdmAR8;_H2(Zgyy7We<(;m?(lQtvxFx6?vC-afhFC<1x z$+sZJ;dy&_2nr6t7xcNVHIAcmGR0>o&>~YXTas5QAfQmi5gqC4>Oq+Jkwd*lyZU>3 z4(&8?PFNt=UqV*K5Y*AeA}UHTFQ%1#08tP-eIh%fRzu{o81B#-@{=&UflfMuANtJ4 zE@ejA$gU|M&?^h>0~?$6V)F{)fEglCNi4*ML8D47HV#98Qr&QHFEGZm?>LWdKDUBI&Jf&{L8cb4mZ~W`gR?5(69Rv6wTt@^em$@3Aw?fRdSI59d z(6&)9zOsN9stw_twVa`{jB|ojmKNzYBkL&aY1MBK!bz!OKKO&LDj(y2QJ@+-E}(!p zl4RF4hEiGB7-gTz&z##oNB*lH;HTzir3{QC6OF;Vt7a9>JD3zFCa1@T#?*XoH2jKe z<07+!-BFwPiqbn&WCRi0PlSMjlLlG!&`#j1b#t$4)N0;#Y=-fw<`!fJs1SP2HYQn$@Bxa2EpIB z7z96o`)|Dz1mA@6dmiRPH@ddRZFYZ8k+r79zkp5tDkWXvy$+kOi>0A7F>fg5npF!GZoHPIi zA3@qjoHUj|LxP=154PVCEcAS3$G>>BCD@ME-r5@Sv3&6B*1<1BYjynt{QnhbuipuR zm%knaw*{?13wYHUCcv+v!#;^ zz~}c)nEzXX*V~@LrS8-Ik}CB%4=UP%b!lsB@b#T+Z6Nnsf-S+3Ur_f!E5rdG@+%0S zErYgJa8|zmiToe5?2ztNyF>5>&iZqlJ;;)8eX+fR~D+GF744o+Baos&Xz0Ibu<^ zc_`aFlx>2-o*>FL)Ng4aCoRf$4`sWca1^lIc0r;1t2>u3>;a3i!$aBOq3jS8ju@is z5L!4^c*mZzC~Y1}n}^aSC>&3!9BDBq>~V{-(?i+mq3jeCjzFU9^k|{Zu_%;6D=(C$ zU6^ZBIZDN@fMb>@>|IL><;J4i>Y?1~q1-Ac9OXp0)kC3PvncQIP&fx#THYZj)C)v; zhoDd+@Q%`FQEu~4IGbw|gkJdnmUH3iS+8ZueS5S+pqB3YNQ^ z(JU?03cCVoCZbR)Snje1EXo}o${ilc9fD#s!ySTRGy^5tqU`oiXjNERb_)t6gS6}x z6r&j^(H7-S59Lllp(bUyI|YS0RNb*f)SkSf3|o}DJe0dUl)D5ajLQ+_F@48zVNve( zQ113n?iQ5xxSWf^abZ#J@lfvZQ10>ga*xLsjth%&uZME4hjOo=Jg#ZES5ThNcN`ZM zH_j%KaY7{T|Bwg0eR*=k^iDlSO&JLwUeMc|cGy8s!0L zk?CoUE{pP@hw`9@@}Qt}Xp{#%6pk*7@{ot}kcaY+pzPBq4++YCeaF#dQ6BbC9`;Zk z7L?Ao9Qk5UDBl+45f9}N59JX-IiOJ<@o3?=uqb;xlsz8G9zn@!lsz5_xolA$^-v!5 zP#zVOgBs=080D+M>EI*=cd_+M@SXgl9UcNbY0q)2Cet_$lW80e$uy3NWEv$tnMS!! zrctJoX_U}p8s#mSM(IhWvGN2d>=zV{Hlpko6pl0AQLkB)P7kHiL+KP0jzv|DeT2zG?x+bZ$^j4MfQNEGP)^3> zh+_JPy3?X$J(R46k`o_leT&p>#`&3<~vyMd|TSdIaUHM(GihXW~1T z7HSBK((9r0dMLeuGOAH}JzA)BEJ~k;(&wS{3CcN*(kCd->N{#3i_-6*^m{1%f-)AD zb6Z5MV^I!yD2F_hLxM7{Q4V>uP+M7)!yd|E59P3+OlXwD9tw5Wu3%C>JK~`n5fmdY zM+9Xm&dC-%r|+n{EXq+2<*0{pR8XelazvTYchp@LnMSEircnlyX_Uld8l^0mMp;XyT}(-P zDJAXQDQTAyX`HuCBF&D5lip}JDWk#6a3^Inuzpp})isn@i!$V)40$L+f2<)NJNP)-So(ZQz##b_*!3X3xAp$vN{!-7Iik(OaWA&+>+ab!_Wdnl(pl+%J@ zbnt197LGiNGUB0(cqk)+^0Kad#6#g&wJ2vilrtX689~WulrtU*N4G^e>!F-KlxIAYXFQZ=1jT6bX9UG)a%vEZGU}m>dMKlUVl?@vpcqX~onukXc_`;R zlyib&H2FC};pk#dQ%hNtXFZf>1?7=AC;h%=o_yBh3-y{s8S_xaJd`n^#mtjqf@0=L zYC?-L?xBo(DC2@+M!>j73w5VOneb31Jd_DRF;>WgM+>#BMVa(aCOwo%K`|p>(xZhG zT9hddWy(XD5|nx5XRl0ov~X-&l;=E@=RB0>1SPLgp7T)HPKz?_p-g)y(}EIdlxeR; z?5kbDf_^sRq09)1u@q+nWiif4jk%=n$SsR9>!HkgD6@i6h|3Yhj3dgTMLF-GaF^ch zAf6YL%Npgpw5V6#Q5G%A^B&6c9?J8AawRTDT8jFPBi*9B;Gw+Wp}Zg{%W*lPl=K}( zx3vzGm$<4N#{dy|M+vhiIS(c0q2vVReQ`N= zR8uA`%AAKX=b_9A%DP6GlaXXbHKo|1%zG&Ff?{;$yr8^aqs$A68P$|~i<0+H@*YZF zP(Gkh@*XW5DHbL2P$CZ{5|sNjN+c++>N}1ti?ZOMEO;mjg7Q6aIag0{G+LBJ4`tCq zSrn8HYLrEx#b{oRUyHKjp)7eQOM+tLWl2zsyl})@l!Av+@K6eZV&tXZ(Lx`!q_? zL!sufD9awovWK!PDBrJ9mIcMgE_IznDS0R*52Yk1e@&y51jY0bwWCETdnjcOr7S2P z(kNv?G4euvYEf1^lobzUMNob~qpS#u=_6`ji}D^10N-A}BwkQ7Rq^wY){CdMH&7r79@K_NaO-;=Eu{Y930>L#YYMhczuVLHUTjBbP18 zs)w@bp{xqZ569)G84Pzxp+&jspy&lSYJ(Twf z%8$n7$lZ_WJMzb(yyBs};-S1ED6hrki1KmVeKi;ietTySJp66OOB`>#Gx(+LoJCIJ z8bn+-KOaVX_=nr%tNzo9{XWEm(J2*x%v1QcWy^m-aN>QzVWcd!-G|E-K%nOhe72lc z@#gly=C{9E9Qf7^95iTct!s1(Qhx9If8rbeYjWw1zxT1WVE^9F|4tXu=rh=gi_bH- zC{s+o4cAFrci|etMZ~`iS=@vFndkHW;0wR@Pk&D3d3E~K)WykeEm>2R&dcjK>y%7aM2%X`~%7daJ!U8 za>M`k0GM^|z%{cJMYZnW9Y`V!T?|bAm7n_R|NPwls~upt-~4QHV3Pxz9N6T*CI>b- zu*rc<4s3E@lLMO^*yO+_2R1pNIlwhF7tvgYb6Q} zdJ@-Dxc1`8;OfA&57&NNowyF*%HleRs|!~*t{z;yxcYGQ<2ra` z2iFI2@%cCP#qXP+zZx8vh9s4PS`b3=OZdMc5(9zQ;OE|8n?#b4TdgP)w()Ned`bSw zP*UHVzmzX?`vPjOK)UCI4odl(``{g7as8xWqoue1zRI}`BX<>}Y8fMuZ65^}7KA3I z)G+?aGTs{D;=La&EqJ&E*GB8F5{$|dpKZ`OWsH8(5J?ZbIePG3fH&QKMm3uH|39Ic Ba|Qqa delta 649 zcmYjOziU%b6#mZ5eaUP3UX!*Fl{Pkm3bm#5b?6{fnu=%_TM?HM(1L{&A_lFxIJ}{5 z4yhNCrIY>vDgje*a__FVwMuYsaun(FyEmltT+aCp=bZa}_eZ>|<62|d698v-qA@x1 z;r2V(sq5FupZ{}eKf^lG^aCio*IyWcLwW^uq#!q&pEf2|YNhh(a_QOJ%=}C=XCk$B zdWnNS^}5*cD~y6&R)$PlRRv}|RXiDU9P*@$$JoR=YG|)!w#DdR)>H;(&33kM&nS(2 zoJuSX$7zQnv358bXB;Ai!$RyO_nqWR6mVUW9BH|ODmJ*b5aAUx4>XN`D8sYbraQGz zNpOkP?V#Q&E6qTzWx>8PF~i*n zztMSq_~YR>X>A3v5;}$c0Q-}YZ~YBqIdqy<-Zt4dFMjK3D7V66x_%>Y*X!L8{{c>I Bl}G>p diff --git a/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce.xls b/src/main/resources/sdtocode/doc/Hadoop MapReduce/Hadoop MapReduce.xls index b28fcdd7b1710bf6526eeb5ca134cd8680467ac4..50e3acdce3007ac4268d5a125ac1f3d1119b6392 100644 GIT binary patch delta 2098 zcmb7^Z%kWN6u{4GUrYb@_0L)w2XsbVvMHlxWFKaL#cd4Jgc)!QS7n91(n5g=1v3{d zQTc!-W8-Wgi*qpNfB}<0P3C6e%#5GJY0S*F56g6)Of(`fVnX7c=e>7n1z$|O&3WhE zbAIQ~z3<)jpVjwI>Q9t$iIbs6_*MXzdw!NfiL-Nevv%Dv4omgLSYhztL%j)~GaW_a%~Z^SovA8w>&m}EQe&ej{=)CUSE{~wY7@G(u~ z!H))i0525aqRGz{;5MuLEHV2v$oCjotLdF#-i)UAUFOx!yc&C-VolW4+78btu_lx= z|J$o(Hesbj%R9$nyDZx{GfI}Aa0~WRg%W_z6_*vip+MVe(OVFtsdLq9!%>T$vnz+= zP!7k5)z)fGz#*$Y;98A36^~ypxn2VN6(y%ziSj5wDZZ{~l$`rQK7daCd@yB~YKrHUThpz8O1 zs-E+!`pZI9k9$;ojqx`b|A6t!jJE_-?q|kJjQ22ZGvju$ytTxaJN((OJ;dP+#~ys$ zQI1)6MWCuF7z~=|tJKqGcoJGF17pGn#svZQyH4Y&)}wAfwR z7VV3!$4@eRpedJ8le6T?)^|r++QshmiFg&*w|j5hde?DQ<7ns^=;I*P)paD&5k1l^ z#(G=C2-VfB_&+x?$ci-X>5Qh6ePTM=(;n&RZlOxa&WLJL)~RH3WN$Jh)*bChiya!J z@7X1oLR;Gf_Y;*`%vYR1eE)DCY#(7Spha8n(EGtyRND&915O7g*pheQ+nnU(LvK zxd$hlqo=y!Xf>8w>1btUE4i~g83UQTkn{bMl>5z-qC$SiNRjRX%bB6_@;35lTtP1~ zG@eI^lsD&u^UT+(kaWCC+pTLzdCN}tfcX+@$V8634IUqq(&Ze3E%_e`6Wcv<8$c4L zAIB}yO)_G`L|JkEb$iLL4w?L78Xz!(mF;J7*W?l>!;fLZrAs*0adUX8*YwIKLv@{Z zIDK~M*jvu|YhhPSJw?4ha)9KaBuNKJH+ZVaj$5pb5hPuxg)U&AW|#z$W*58Pl_K@U>>;BS#0N7- zJ&KT`S*><4tDPt+NP~#pLW?#cDk`Xl%6y1O(CN(Rj1c<|-#_R4-*;~R&emV$>btp? z6|B59JfA-T0CzUuVyH4V8&%wvI)*>F3asPdJxPRjU;zoM_+|K(3*ZQsX1hyy)rhje+QJ0`WdByZ0NSCp_+I%Vh!DVWyTk&x zT+sFmhm=6sHLEO6$PUi3k%VmXESos95&OX*;WJkX>%k{330oXC-D}pp66cI}NB8QT z>CB3~PAO=kA@qq}K?#`|03&*>Bz!@veU6pM^cbw2VrBee_b`V(vxtR4Axp;dg5;;$ znaS8*Q8An`oB{lO92G*$r`2N~92W}pz8>qH9B|F_^&ml)BQ9G|FtV99enaoijUQZ6 z&}FdgK3}KMDFA;G^(!MFWc#-wNQyzET%$kZmufJvLnHn^Zzp}PF;lxVS zyA>?5mPKEOY5&noA07fsbpcqf03=0~iR$kQ*kR>;>)td}uAgzl!3hsZnuYm;EB#q| zD1$6|Kpm%kBy1X7kv>;I)D_xBeL-tKz}J49sP4v^n-feEFT|#yYi+k{?H9i^XTFXz zPU(v@cw!?(zKzqWs&1pG?SwMI4#G~tF2Zht#_y%~KEi&&0m4DTA%ZrJ#!nHZTQ?tX m8>>wEShnqvHy+2Du|`YT08WmbVq3BHWyH0I#Gw7_X#E4Bt4M$V -- Gitee From 7ccdd145a93617f0d8136d3c77bf9b0f665ac0cd Mon Sep 17 00:00:00 2001 From: chief Date: Mon, 23 May 2022 15:28:33 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E9=A1=BA=E5=BA=8F=E5=9B=BE=E4=B8=89?= =?UTF-8?q?=E4=B8=AA=E5=AE=9E=E9=AA=8C=E7=9A=84=E5=8E=9F=E5=A7=8B=E8=BF=BD?= =?UTF-8?q?=E8=B8=AA=E7=BB=93=E6=9E=9C=E5=9D=87=E5=B7=B2=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdtocode/mapper/CodeMessageTracer.java | 54 ++++++++++++++---- src/main/resources/sdtocode/Hadoop HDFS1.xls | Bin 66048 -> 69120 bytes src/main/resources/sdtocode/Hadoop HDFS2.xls | Bin 26112 -> 68608 bytes .../resources/sdtocode/Hadoop MapReduce.xls | Bin 69120 -> 28672 bytes 4 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java b/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java index 1099b02..b748632 100644 --- a/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java +++ b/src/main/java/com/hy/java/uct/sdtocode/mapper/CodeMessageTracer.java @@ -729,8 +729,16 @@ public class CodeMessageTracer { } // 如果返回类型不像,但名称过于相似,则也认为是追踪 if (!return_similar) { - String msg_pure_methodName = msg_inSD.msg.substring(0, msg_inSD.msg.lastIndexOf("(")); - returnType_sim = jaccard_similarity(md.getNameAsString().toLowerCase(), msg_pure_methodName.toLowerCase()); + String msg_pure_methodName = msg_inSD.msg; + if (msg_inSD.msg.contains("(")) { + msg_pure_methodName = msg_inSD.msg.substring(0, msg_inSD.msg.lastIndexOf("(")); + + } + if (md.getNameAsString().toLowerCase().contains(msg_pure_methodName.toLowerCase())) { + returnType_sim = 1.0; + } else { + returnType_sim = jaccard_similarity(md.getNameAsString().toLowerCase(), msg_pure_methodName.toLowerCase()); + } if (returnType_sim >= 0.75) { return_similar = true; } @@ -1192,14 +1200,40 @@ public class CodeMessageTracer { for (int i = 0; i < tracing_ways; i++) { MessageTracedLink tracing_way = msg.traced_link_ls.get(i); int identifier_num = tracing_way.identifiers.size(); - for (int j = 0; j < identifier_num; j++) { - Triple traced_file = tracing_way.identifiers.get(j); - sheet1.addCell(new Label(0, row, msg.msg)); - sheet1.addCell(new Label(1, row, String.valueOf(j + 1))); - sheet1.addCell(new Label(2, row, traced_file.getLeft())); - sheet1.addCell(new Label(3, row, traced_file.getMid())); - sheet1.addCell(new Label(4, row, String.valueOf(traced_file.getRight()))); - row++; + if (identifier_num > 1) { + for (int j = 0; j < identifier_num; j++) { + Triple traced_file = tracing_way.identifiers.get(j); + sheet1.addCell(new Label(0, row, msg.msg)); + sheet1.addCell(new Label(1, row, String.valueOf(j + 1))); + sheet1.addCell(new Label(2, row, traced_file.getLeft())); + sheet1.addCell(new Label(3, row, traced_file.getMid())); + sheet1.addCell(new Label(4, row, String.valueOf(traced_file.getRight()))); + row++; + } + } else { + for (int j = 0; j < identifier_num; j++) { + Triple traced_file = tracing_way.identifiers.get(j); + // 追踪概率过小的不保存 + if (msg.msg.contains("run")) { + if (traced_file.getRight() >= 0.625) { + sheet1.addCell(new Label(0, row, msg.msg)); + sheet1.addCell(new Label(1, row, String.valueOf(j + 1))); + sheet1.addCell(new Label(2, row, traced_file.getLeft())); + sheet1.addCell(new Label(3, row, traced_file.getMid())); + sheet1.addCell(new Label(4, row, String.valueOf(traced_file.getRight()))); + row++; + } + } else { + if (traced_file.getRight() >= 0.75) { + sheet1.addCell(new Label(0, row, msg.msg)); + sheet1.addCell(new Label(1, row, String.valueOf(j + 1))); + sheet1.addCell(new Label(2, row, traced_file.getLeft())); + sheet1.addCell(new Label(3, row, traced_file.getMid())); + sheet1.addCell(new Label(4, row, String.valueOf(traced_file.getRight()))); + row++; + } + } + } } } } diff --git a/src/main/resources/sdtocode/Hadoop HDFS1.xls b/src/main/resources/sdtocode/Hadoop HDFS1.xls index e0f4f87442afc3ed4830f23bdfde7b06f40ac324..a046568c648a0954cf198503579b2475fcc96bef 100644 GIT binary patch literal 69120 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 Vqlc$Gyzd+hwg2C@x!i64{{bfn3H1N~ literal 66048 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 C$iGJb diff --git a/src/main/resources/sdtocode/Hadoop MapReduce.xls b/src/main/resources/sdtocode/Hadoop MapReduce.xls index 39772bdf0f296aa2fcf2323db9edcd5ee9d0fe29..8c201613e28ef9ae3f0c6ecac6f442702d15c970 100644 GIT binary patch literal 28672 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 literal 69120 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 Ba|Qqa -- Gitee