提交 2392cdac authored 作者: 马晨俊's avatar 马晨俊

mcj:编写注释

上级 88bbce8f
......@@ -17,8 +17,11 @@ import java.sql.Timestamp;
@Data
public class Budget {
/**
* 代码重构预算、代码修改预算、
* 名称
* 代码重构预算
* 代码修改预算、
*/
private String budgetName;
/**
......
......@@ -12,7 +12,7 @@ import java.util.List;
* @date 2020-02-21 20:26
*/
@Data
public class DepTreeVo implements Serializable {
public class DependencyVo implements Serializable {
private List<ProjectPom> depTreeList = new ArrayList<>();
private List<ProjectPom> frontend = new ArrayList<>();
......
package com.zjty.inspect.entity;
import lombok.Data;
/**
* @author Mcj
* @date 2020-03-03 11:56
*/
@Data
public class Pages {
private int page;
private String id;
}
......@@ -23,25 +23,5 @@ public class PomAnalysis {
private String name;
private String url;
private String description;
//private List<Prerequisite> prerequisites;//描述了这个项目构建环境中的前提条件。 -->
//private IssueManagement issueManagement;//项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL
//private CiManagement ciManagement;//项目持续集成信息
//private String inceptionYear;//项目创建年份,4位数字。当产生版权信息时需要使用这个值
//private MailingLists mailingLists;//项目相关邮件列表信息
//private Developers developers;//项目开发者列表
//private Contributors contributors;//项目的其他贡献者列表
//private List<License> licenses;//该元素描述了项目所有License列表。 应该只列出该项目的license列表,不要列出依赖项目的 license列表。如果列出多个license,用户可以选择它们中的一个而不是接受所有license
//private Scm scm;//SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用
//private Organization organization;//描述项目所属组织的各种属性。Maven产生的文档用
//private Build build;//构建项目需要的信息
//private List<Profile> profiles;//在列的项目构建profile,如果被激活,会修改构建处理
//private List<Module> modules;//模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径
//private List<Repository> repositories;//发现依赖和扩展的远程仓库列表
//private List<PluginRepository> pluginRepositiries;//发现插件的远程仓库列表,这些插件用于构建和报表
private List<PomDependency> dependencies;
//private Repoting repoting;//该元素描述使用报表插件产生报表的规范。当用户执行“mvn site”,这些报表就会运行。 在页面导航栏能看到所有报表的链接
//private DependencyManagement dependencyManagement;//继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述group ID和artifact ID信息),如果group ID和artifact ID以外的一些信息没有描述,则通过group ID和artifact ID匹配到这里的依赖,并使用这里的依赖信息
//private DistributionManagement distributionManagement;//项目分发信息,在执行mvn deploy后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库
//private Properties properties;//以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里activation元素的说明)。格式是<name>value</name>
}
package com.zjty.inspect.entity;
import lombok.Data;
/**
* @author Mcj
* @date 2020-02-17 16:11
*/
@Data
public class Properties {
private String name;
private String value;
}
......@@ -3,7 +3,6 @@ package com.zjty.inspect.entity;
import lombok.Data;
import javax.persistence.Column;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
......@@ -59,7 +58,7 @@ public class ReportVo {
/**
* 依赖
*/
private DepTreeVo depTreeVo;
private DependencyVo dependencyVo;
/**
* 匹配技术列表
......
......@@ -29,6 +29,11 @@ public class Warn {
*/
private String technologyId;
/**
* 适配技术名称
*/
private String technologyName;
/**
* 关键字id
*/
......
package com.zjty.inspect.enums;
/**
* @author mcj
*/
public enum DependenceManagement {
/**
* maven方式
*/
MAVEN,
/**
* gradle方式
*/
GRADLE,
}
package com.zjty.inspect.enums;
/**
*
*
* @author mcj
*/
public enum Language {
/**
* java类型
*/
JAVA,
/**
* pyth类型
*/
PYTHON,
/**
* asp
*/
ASP,
/**
* js
*/
JAVASCRIPT,
/**
* go
*/
GO,
/**
* html
*/
HTML,
UNKNOW,
}
......@@ -32,12 +32,15 @@ public class InspectServiceImpl implements InspectService {
suffixLanguageMapping.put("vue", Report.Language.VUE);
suffixLanguageMapping.put("cpp", Report.Language.CPP);
suffixLanguageMapping.put("py", Report.Language.PYTHON);
suffixLanguageMapping.put("jsp", Report.Language.JSP);
suffixLanguageMapping.put("jsp", Report.Language.JAVA);
suffixLanguageMapping.put("go", Report.Language.GO);
suffixLanguageMapping.put("js", Report.Language.JAVASCRIPT);
suffixLanguageMapping.put("html", Report.Language.HTML);
//构造成员变量
inspector.setInspectParameter(inspectParameter);
//构造报告vo
inspector.setReport(reportVo);
//需要重构
inspector.setSuffixLanguageMapping(suffixLanguageMapping);
ReportVo report = inspector.inspect();
return report;
......
......@@ -5,6 +5,7 @@ import com.zjty.inspect.entity.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -25,6 +26,7 @@ import java.util.stream.Collectors;
@AllArgsConstructor
@NoArgsConstructor
@Service
@Slf4j
public class Inspector {
@Autowired
......@@ -41,7 +43,7 @@ public class Inspector {
@Autowired
private ParameterDao parameterDao;
private DepTreeVo depTreeVo = new DepTreeVo();
private DependencyVo dependencyVo = new DependencyVo();
private ArrayList<Rule> rules = new ArrayList<Rule>();
private ArrayList<Warn> warns = new ArrayList<>();
......@@ -50,7 +52,7 @@ public class Inspector {
* key:mysql-connect:*
* value:随意
*/
private HashMap<String,Rule> ruleMap = new HashMap<>();
private HashMap<String, Rule> ruleMap = new HashMap<>();
/**
* 支持的国产化技术
......@@ -142,7 +144,7 @@ public class Inspector {
ruleSuffixList.get(rule.getSuffix()).add(rule);
}
//规则添加时去重使用,mysql-connect:*
ruleMap.put(rule.getTarget()+":"+rule.getSuffix(),rule);
ruleMap.put(rule.getTarget() + ":" + rule.getSuffix(), rule);
}
try {
......@@ -153,10 +155,12 @@ public class Inspector {
for (String s : suffixLanguageMapping.keySet()) {
languageSuffixMatcherMapping.put(s, aDefault.getPathMatcher("glob:**/*." + s));
}
//构造各个配置文件的正则表达式,用于解析依赖
Map<PathMatcher, String> configFileMatcherSuffixMapping = new HashMap<>(16);
for (String s : configFileTypePathsMapping.keySet()) {
configFileMatcherSuffixMapping.put(aDefault.getPathMatcher("glob:**/*." + s), s);
}
//构造规则后缀的正则表达式
Map<PathMatcher, String> ruleSuffix = new HashMap<>(16);
for (String s : ruleSuffixMap.keySet()) {
ruleSuffix.put(aDefault.getPathMatcher("glob:**/*." + s), s);
......@@ -175,47 +179,59 @@ public class Inspector {
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
for (Map.Entry<String, PathMatcher> entry : languageSuffixMatcherMapping.entrySet()) {
//通过正则表达式匹配.java类型后缀文件,并+1
if (entry.getValue().matches(file)) {
languageMatchMap.get(entry.getKey()).plus();
}
}
for (Map.Entry<PathMatcher, String> entry : configFileMatcherSuffixMapping.entrySet()) {
//通过配置文件正则表达式匹配.xml文件,记录文件地址
if (entry.getKey().matches(file)) {
configFileTypePathsMapping.get(entry.getValue()).add(file);
}
}
for (Map.Entry<PathMatcher, String> entry : ruleSuffix.entrySet()) {
//通过规则匹配后缀正则表达式匹配,记录匹配上的文件地址
if (entry.getKey().matches(file)) {
ruleSuffixMap.get(entry.getValue()).add(file);
}
}
//获取普通依赖jar
//检查到普通jar包
if (file.toString().endsWith(".jar")) {
//新建一个pom对象
ProjectPom projectPom = new ProjectPom();
// TODO: 2020-02-28 jar文件需要修改格式变为string
//截取jar名称
String[] split = file.getFileName().toString().split("\\.");
//新建一个依赖对象
PomDependency pomDependency = new PomDependency();
pomDependency.setArtifactId(split[0]);
projectPom.getDependencies().add(pomDependency);
if(inspectParameter.getAdmin()==1){
//当参数为1时代表上传者管理员,代码可绝对信任,将jar名称当作可支持依赖添加进规则库中
if (inspectParameter.getAdmin() == 1) {
//新建规则对象
Rule rule = new Rule();
//设置适配技术id
rule.setTechnologyId(techJavaSupport.getId());
rule.setTarget(split[0]);
//设置文件后缀
rule.setSuffix("*");
rule.setId(UUIDUtil.getUUID());
if(!ruleMap.containsKey(split[0]+":"+rule.getSuffix())){
//做规则查询,不用去数据库查询
if (!ruleMap.containsKey(split[0] + ":" + rule.getSuffix())) {
rules.add(rule);
ruleMap.put(split[0]+":"+rule.getSuffix(),rule);
ruleMap.put(split[0] + ":" + rule.getSuffix(), rule);
}
//设置当前依赖为可支持
pomDependency.setSupport(1);
}else{
} else {
//为普通用户上传,依赖需要检查是否支持。
int i = valiWarn(ruleList, file, split[0], 0);
if(i==0){
//如果值为0则代表是有不支持技术到匹配
if (i == 0) {
pomDependency.setSupport(2);
projectPom.getDependencies().add(pomDependency);
}
}
depTreeVo.add(projectPom);
dependencyVo.add(projectPom);
}
return FileVisitResult.CONTINUE;
}
......@@ -243,24 +259,27 @@ public class Inspector {
*/
@Transactional
public ReportVo analysis() {
DepTreeVo depTreeVo = new DepTreeVo();
DependencyVo dependencyVo = new DependencyVo();
String most = null;
int maxnum = 0;
//统计文件最多的
for (Map.Entry<String, Counter> entry : languageMatchMap.entrySet()) {
if (entry.getValue().getNumber() > maxnum) {
most = suffixLanguageMapping.get(entry.getKey()).name();
maxnum = entry.getValue().getNumber();
}
}
//设置语言
report.setLanguage(most == null ? Report.Language.UNKNOW.name() : most);
//设置架构
report.setFramework(languageMatchMap.get("jsp").i > 0 ? "混合型架构" : "分离型架构");
//设置是否需要重构
if (languageMatchMap.get("jsp").i == 0 & languageMatchMap.get("java").i == 0) {
report.setRecastMethod(2);
} else {
report.setRecastMethod(1);
}
// TODO: 2020-02-28 jsFiles, jarFiles
//解析配置文件集合
for (Map.Entry<String, List<Path>> entry : configFileTypePathsMapping.entrySet()) {
switch (entry.getKey()) {
/**
......@@ -275,38 +294,9 @@ public class Inspector {
StringBuilder stringBuilder = new StringBuilder();
for (PomDependency dependency : projectPom.getDependencies()) {
stringBuilder.append(dependency.getGroupId()).append(":").append(dependency.getArtifactId());
if(inspectParameter.getAdmin()==1){
Rule rule = new Rule();
rule.setTechnologyId(techJavaSupport.getId());
rule.setTarget(dependency.getGroupId());
rule.setSuffix("*");
rule.setId(UUIDUtil.getUUID());
Rule rule1 = new Rule();
rule1.setTechnologyId(techJavaSupport.getId());
rule1.setTarget(dependency.getArtifactId());
rule1.setSuffix("*");
rule1.setId(UUIDUtil.getUUID());
if(!ruleMap.containsKey(dependency.getGroupId()+":"+rule.getSuffix())){
rules.add(rule);
ruleMap.put(dependency.getGroupId()+":"+rule.getSuffix(),rule);
}
if(!ruleMap.containsKey(dependency.getArtifactId()+":"+rule1.getSuffix())){
rules.add(rule1);
ruleMap.put(dependency.getArtifactId()+":"+rule1.getSuffix(),rule1);
}
dependency.setSupport(1);
}else{
int i = valiWarn(ruleList, path, stringBuilder.toString(), 0);
if(i==0){
dependency.setSupport(2);
}
}
stringBuilder.delete(0,stringBuilder.length());
setRule(path, stringBuilder, dependency);
}
depTreeVo.add(projectPom);
dependencyVo.add(projectPom);
}
}
break;
......@@ -320,111 +310,144 @@ public class Inspector {
//设置依赖
StringBuilder stringBuilder = new StringBuilder();
for (PomDependency dependency : pomDependencies) {
stringBuilder.append(dependency.getGroupId()).append(":").append(dependency.getArtifactId());
if(inspectParameter.getAdmin()==1){
Rule rule = new Rule();
rule.setTechnologyId(techJavaSupport.getId());
rule.setTarget(dependency.getGroupId());
rule.setSuffix("*");
rule.setId(UUIDUtil.getUUID());
Rule rule1 = new Rule();
rule1.setTechnologyId(techJavaSupport.getId());
rule1.setTarget(dependency.getArtifactId());
rule1.setSuffix("*");
rule1.setId(UUIDUtil.getUUID());
if(!ruleMap.containsKey(dependency.getGroupId()+":"+rule.getSuffix())){
rules.add(rule);
ruleMap.put(dependency.getGroupId()+":"+rule.getSuffix(),rule);
}
if(!ruleMap.containsKey(dependency.getArtifactId()+":"+rule1.getSuffix())){
rules.add(rule1);
ruleMap.put(dependency.getArtifactId()+":"+rule1.getSuffix(),rule1);
}
dependency.setSupport(1);
}else{
int i = valiWarn(ruleList, path, stringBuilder.toString(), 0);
if(i==0){
dependency.setSupport(2);
}
}
stringBuilder.delete(0,stringBuilder.length());
setRule(path, stringBuilder, dependency);
}
depTreeVo.add(projectPom);
dependencyVo.add(projectPom);
}
}
break;
default:
}
}
//指定后缀到文件匹配关键字
for (Map.Entry<String, List<Path>> entry : ruleSuffixMap.entrySet()) {
//entry,key为后缀,value为文件列表
String key = entry.getKey();
//从ruleSuffixList获取指定后缀的规则列表
List<Rule> rules = ruleSuffixList.get(key);
for (Path path1 : entry.getValue()) {
try {
if(path1.toAbsolutePath().toString().endsWith("jar") || path1.toAbsolutePath().toString().endsWith("class")){
//如果文件类型为jar活着class则不读取
if (path1.toAbsolutePath().toString().endsWith("jar") || path1.toAbsolutePath().toString().endsWith("class")) {
continue;
}
//将文件的每一行都与规则匹配
List<String> strings = Files.readAllLines(path1);
for (int i = 0; i < strings.size(); i++) {
valiWarn(rules, path1, strings.get(i), i + 1);
}
} catch (MalformedInputException e){
} catch (IOException e) {
e.printStackTrace();
log.error("解析{}出错,异常信息为{}",path1.toAbsolutePath().toString(),e.getMessage());
}
}
}
//将得到的告警信息根据技术id进行转换
Set<String> collect = warns.stream().map(Warn::getTechnologyId).collect(Collectors.toSet());
List<Technology> allById = technologyDao.findAllById(collect);
Integer fund = 0;
//计算技术金额
for (Technology tech : allById) {
fund += tech.getFund();
}
//计算预算,三种预算
//计算预算
if (inspectParameter.getValid() != null) {
List<Budget> budget = budgetUitl.getBudget(fund, inspectParameter);
report.setBudgets(budget);
inspectParameter.setId(UUIDUtil.getUUID());
parameterDao.save(inspectParameter);
}
//填充地址(如果有)
report.setGitAddress(inspectParameter.getGitAddress());
//填充适配技术
report.setTechnologies(allById);
report.setDepTreeVo(depTreeVo);
//填充依赖
report.setDependencyVo(dependencyVo);
//数据转换
HashMap<String, Technology> map = new HashMap<>();
for (Technology technology1 : allById) {
map.put(technology1.getId(),technology1);
map.put(technology1.getId(), technology1);
}
HashMap<String, List<Warn>> warnMap = new HashMap<>();
for (Warn warn : warns) {
if(!warnMap.containsKey(map.get(warn.getTechnologyId()).getTechnologyName())){
if (!warnMap.containsKey(map.get(warn.getTechnologyId()).getTechnologyName())) {
ArrayList<Warn> warns1 = new ArrayList<>();
warns1.add(warn);
warnMap.put(map.get(warn.getTechnologyId()).getTechnologyName(),warns1);
}else{
warnMap.put(map.get(warn.getTechnologyId()).getTechnologyName(), warns1);
} else {
warnMap.get(map.get(warn.getTechnologyId()).getTechnologyName()).add(warn);
}
}
ruleDao.saveAll(rules);
report.setWarnDetails(warnMap);
// TODO: 2020-02-28 生成报告,返回地址 report.setsourceaddress;
return report;
}
public int valiWarn(List<Rule> rules, Path path, String name, int num) {
/**
* @param path 文件路径
* @param stringBuilder string缓冲区
* @param dependency 依赖
*/
private void setRule(Path path, StringBuilder stringBuilder, PomDependency dependency) {
stringBuilder.append(dependency.getGroupId()).append(":").append(dependency.getArtifactId());
if (inspectParameter.getAdmin() == 1) {
Rule rule = new Rule();
rule.setTechnologyId(techJavaSupport.getId());
rule.setTarget(dependency.getGroupId());
//?
rule.setSuffix("*");
rule.setId(UUIDUtil.getUUID());
Rule rule1 = new Rule();
rule1.setTechnologyId(techJavaSupport.getId());
rule1.setTarget(dependency.getArtifactId());
//?
rule1.setSuffix("*");
rule1.setId(UUIDUtil.getUUID());
if (!ruleMap.containsKey(dependency.getGroupId() + ":" + rule.getSuffix())) {
rules.add(rule);
ruleMap.put(dependency.getGroupId() + ":" + rule.getSuffix(), rule);
}
if (!ruleMap.containsKey(dependency.getArtifactId() + ":" + rule1.getSuffix())) {
rules.add(rule1);
ruleMap.put(dependency.getArtifactId() + ":" + rule1.getSuffix(), rule1);
}
dependency.setSupport(1);
} else {
int i = valiWarn(ruleList, path, stringBuilder.toString(), 0);
if (i == 0) {
dependency.setSupport(2);
}
}
stringBuilder.delete(0, stringBuilder.length());
}
/**
* 将数据与规则进行匹配,得出是否支持
*
* @param rules 规则
* @param path 匹配的文件
* @param data 行数据
* @param num 行数
* @return 1:正常、2:不支持依赖
*/
public int valiWarn(List<Rule> rules, Path path, String data, int num) {
//a为1代表当前依赖没有问题
int a = 1;
for (Rule rule : rules) {
if(name.isEmpty()){
//规则目标字符串为null 或者 空时
if (rule.getTarget()==null || rule.getTarget().isEmpty()) {
continue;
}
int ik = KmpUtil.kmpMatch(name, rule.getTarget());
if (ik > 0) {
//rule匹配上了
if(rule.getTechnologyId().equals(techNotCnSupport.getId())){
//匹配字符串
int index = KmpUtil.kmpMatch(data, rule.getTarget());
//当index>0时代表data中有当前规则
if (index > 0) {
//判断当前规则是否是不支持规则
if (rule.getTechnologyId().equals(techNotCnSupport.getId())) {
//如果是不支持规则则需要保存匹配信息
Warn warn = new Warn();
warn.setFilePath(path.toAbsolutePath().toString());
warn.setLineNum(num);
......@@ -432,12 +455,14 @@ public class Inspector {
warn.setRuleId(rule.getId());
warn.setRule(rule.getTarget());
warns.add(warn);
a=0;
//设置a=0代表当前依赖有问题
a = 0;
}
}
}
return a;
}
public class Counter {
private int i = 0;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论