提交 9fd140de authored 作者: wyl's avatar wyl

“体检”改为“评估”

上级 e3bccd56
......@@ -152,6 +152,16 @@
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.10</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.10</version>
</dependency>
</dependencies>
<build>
......
Manifest-Version: 1.0
Main-Class: com.zjty.adaptationmaster.utils.Inspector
......@@ -2,9 +2,7 @@ package com.zjty.adaptationmaster;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
@SpringBootApplication
@EnableScheduling
......
......@@ -33,6 +33,10 @@ public class AdaptationController {
System.out.print(JSON.toJSONString(adaptRequest));
return adaptationService.compile(adaptRequest.getProject(),adaptRequest.getUuid());
}
@PostMapping("/uploadDeploy")
public ServerResponse uploadDeploy(@RequestBody AdaptRequest adaptRequest){
return adaptationService.uploadDeploy(adaptRequest.getProject(),adaptRequest.getPath());
}
@PostMapping("/deploy")
public ServerResponse deploy(@RequestBody AdaptRequest adaptRequest){
return adaptationService.deploy(adaptRequest.getProject(),adaptRequest.getUuid());
......
package com.zjty.adaptationmaster.adaptor.entity;
import com.zjty.adaptationmaster.utils.Assessor;
import com.zjty.adaptationmaster.utils.Inspector;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -19,14 +21,18 @@ public class Report {
private Integer id;
private Language language;//语言
private String framework;//架构
private Separate isSeparate;//前后端是否分离
private DatabaseType databaseType;//数据库类型
private int fileNum;
private long lineNum;
private List<Inspector.Warn> warnList;
private Separate isSeparate;//前后端是否分离
private String compileFilePath;//项目编译文件,如果是maven项目,用maven编译,那么就是pom.xml
public DependenceManagement dependenceManagement;//版本管理方式
@ElementCollection
public List<String> jarPath;//依赖文件的地址列表,用于编译,如果不是用版本管理工具
private String packagePath;
private int fileNum;
public enum DependenceManagement{
MAVEN,GRADLE,ANT
......@@ -38,6 +44,6 @@ public class Report {
MYSQL,ORACLE,SQLSERVER,POSTGRE
}
public enum Language{
JAVA,PYTHON,CPP,JSP,ONLYVIEW
JAVA,PYTHON,CPP,JSP,ASP,ONLYVIEW
}
}
......@@ -43,6 +43,10 @@ public class Rule {
private String target;//文本匹配目标
private String replacing;//更改方式 全文替换/正则替换
public Rule(String target,String replacing){
this.target = target;
this.replacing = replacing;
}
// public enum MatchType{
// PATH,NAME,SUFFIX,GLOB
// }
......
package com.zjty.adaptationmaster.adaptor.entity.pomEntity;
import com.zjty.adaptationmaster.adaptor.entity.pomEntity.SecondFloor.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@NoArgsConstructor
@Data
public class ProjectPom {
private Parent parent;
private String modelVersion;
private String groupId;
private String artifactId;
private String packaging;
private String version;
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<Dependency> 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.adaptationmaster.adaptor.entity.pomEntity.SecondFloor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@NoArgsConstructor
@Data
public class Dependency {
private String groupId;
private String artifactId;
private String version;
/*依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展
名或分类器。类型经常和使用的打包方式对应,尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。
如果设置extensions为 true,就可以在plugin里定义新的类型。所以前面的类型的例子不完整
*/
private String type;
/*依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,
如果你想要构建两个单独的构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生
成两个单独的JAR构件
*/
private String classifier;
/*
依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。
- compile :默认范围,用于编译
- provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
- runtime: 在执行时需要使用
- test: 用于test任务时使用
- system: 需要外在提供相应的元素。通过systemPath来取得
- systemPath: 仅用于范围为system。提供相应的路径
- optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用
*/
private String scope;
/*
仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件
系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}
*/
private String systemPath;
/*
当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的
依赖。此元素主要用于解决版本冲突问题
*/
private List<Exclusion> exclusions;
/*
可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。
可选依赖阻断依赖的传递性
*/
private String optional;
private class Exclusion{
private String artifactId;
private String groupId;
}
private List<Dependency> parentDependencies;
}
package com.zjty.adaptationmaster.adaptor.entity.pomEntity.SecondFloor;
public class Parent {
private String artifactId;
private String groupId;
private String version;
private String relativePath;
}
package com.zjty.adaptationmaster.adaptor.service;
import com.zjty.adaptationmaster.adaptor.entity.AdaptRequest;
import com.zjty.adaptationmaster.adaptor.entity.Project;
import com.zjty.adaptationmaster.adaptor.entity.Rule;
import com.zjty.adaptationmaster.base.response.ServerResponse;
......@@ -21,4 +22,6 @@ public interface AdaptationService {
ServerResponse start(Project project, String uuid);
ServerResponse stop(Project project, String uuid);
ServerResponse uploadDeploy(Project project, String path);
}
......@@ -8,12 +8,16 @@ import com.zjty.adaptationmaster.base.enums.Const;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import com.zjty.adaptationmaster.adaptor.service.AdaptationService;
import com.zjty.adaptationmaster.utils.*;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
......@@ -21,6 +25,7 @@ import static java.util.stream.Collectors.toList;
@Service
public class AdaptationServiceImpl implements AdaptationService {
Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private Adaptor adaptor;
@Autowired
......@@ -97,6 +102,26 @@ public class AdaptationServiceImpl implements AdaptationService {
return ServerResponse.success(new ApusicDeployer(Const.CTLPATH,Const.MAVENHOME).stop(project.getProjectName(),uuid));
}
@Override
@Transactional
public ServerResponse uploadDeploy(Project project, String path) {
File file = new File(path);
File deployFile = new File(project.getCodeUrl()+"/"+file.getName());
File parentFile = deployFile.getParentFile();
if (!parentFile.exists()||!parentFile.isDirectory()){
parentFile.mkdirs();
}
try {
FileUtils.moveFile(file,deployFile);
} catch (IOException e) {
logger.info("预部署包转存失败"+e.getMessage());
return ServerResponse.error("系统错误,文件上传失败");
}
project.setStage(2);
projectDao.getOne(project.getId()).setStage(2);
return ServerResponse.success();
}
private Project filter(Project pro){
//过滤删除的规则集
List<RuleSet> ruleSets = pro.getRuleSets();
......
......@@ -7,6 +7,7 @@ import com.zjty.adaptationmaster.adaptor.repository.ReportDao;
import com.zjty.adaptationmaster.adaptor.service.InspectService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import com.zjty.adaptationmaster.utils.Inspector;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -33,8 +34,10 @@ public class InspectServiceImpl implements InspectService {
suffixLanguageMapping.put("cpp",Report.Language.CPP);
suffixLanguageMapping.put("py",Report.Language.PYTHON);
suffixLanguageMapping.put("jsp",Report.Language.JSP);
suffixLanguageMapping.put("asp",Report.Language.ASP);
//suffixLanguageMapping.put("html",Report.Language.ONLYVIEW);
Report report = new Inspector(project, suffixLanguageMapping).inspect();
LoggerFactory.getLogger(getClass()).info("这里rulelist为空,需要设置");
Report report = new Inspector(project, suffixLanguageMapping, new ArrayList<>()).inspect();
if(report.getPackagePath() == null){
report.setPackagePath(project.getCodeUrl());
}
......
package com.zjty.adaptationmaster.utils;
import com.zjty.adaptationmaster.adaptor.entity.Project;
import com.zjty.adaptationmaster.adaptor.entity.Rule;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.IOException;
import java.nio.charset.MalformedInputException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;
public class Assessor {
public static void main(String[] args) {
Assessor assessor = new Assessor();
Rule rule = new Rule();
rule.setTarget("aa?*");
rule.setReplacing("建议修改为bb");
List<Rule> rules = new ArrayList<>();
rules.add(rule);
assessor.setRuleList(rules);
Project project = new Project();
project.setCodeUrl("D:\\project\\bservice");
assessor.assess(project);
}
List<Rule> ruleList;
public void setRuleList(List<Rule> ruleList) {
this.ruleList = ruleList;
}
List<Warn> warnList = new ArrayList<>();
int lineNum = 0;
public void assess(Project project){
try {
Files.walkFileTree(Paths.get(project.getCodeUrl()), new SimpleFileVisitor<Path>(){
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
List<String> allLines;
try {
allLines = Files.readAllLines(file);
}catch (MalformedInputException e){
return FileVisitResult.CONTINUE;
}
lineNum += allLines.size();
for(int i = 0;i<allLines.size();i++){
String s = allLines.get(i);
for(Rule rule:ruleList){
if (s.indexOf(rule.getTarget())>-1){
warnList.add(new Warn(file,i+1,rule.getTarget(),rule.getReplacing()));
}
}
}
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
for(Warn warn:warnList){
System.out.println(warn);
}
}
// public class ProjectFile{
// private Path path;
// private BasicFileAttributes attributes;
// private List<String> allLines;
// }
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Warn{
private Path path;
private int line;
private String keyWord;
private String suggest;
}
}
package com.zjty.adaptationmaster.utils;
import com.thoughtworks.xstream.XStream;
import com.zjty.adaptationmaster.adaptor.entity.Project;
import com.zjty.adaptationmaster.adaptor.entity.Report;
import com.zjty.adaptationmaster.adaptor.entity.Rule;
import com.zjty.adaptationmaster.adaptor.entity.pomEntity.ProjectPom;
import com.zjty.adaptationmaster.adaptor.entity.pomEntity.SecondFloor.Dependency;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.MalformedInputException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.LocalDateTime;
import java.util.*;
/**
......@@ -23,15 +34,37 @@ import java.util.*;
public class Inspector {
public static void main(String[] args) {
Project project = new Project();
project.setCodeUrl("C:\\home\\project\\rsc\\hrmbclient");
System.out.println(LocalDateTime.now());
//System.out.println("请输入项目地址,然后回车");
//Scanner scanner = new Scanner(System.in);
//String next = scanner.next();
//Project project = new Project();
//project.setCodeUrl(next);
Map<String, Report.Language> suffixLanguageMapping = new HashMap<>();
suffixLanguageMapping.put("java",Report.Language.JAVA);
suffixLanguageMapping.put("cpp",Report.Language.CPP);
suffixLanguageMapping.put("py",Report.Language.PYTHON);
suffixLanguageMapping.put("jsp",Report.Language.JSP);
Inspector inspector = new Inspector(project,suffixLanguageMapping);
System.out.println(inspector.inspect());
List<Rule> ruleList = new ArrayList<>();
ruleList.add(new Rule("com.mysql.cj.jdbc.Driver","建议修改为postgre数据库驱动"));
ruleList.add(new Rule("<artifactId>mysql-connector-java</artifactId>","建议修改为postgre依赖声明"));
ruleList.add(new Rule("public native","这里用到了JNI"));
ruleList.add(new Rule("<packaging>jar</packaging>","建议修改打包方式为war包并排除掉springboot内置的tomcat"));
String[] projectSrc = {"D:\\project\\testAccess\\SpringBoot-Labs-master"/*"D:\\project\\bservice","D:\\project\\debug","D:\\project\\glutton"*/};
//String[] projectSrc = {"D:\\project\\testAccess\\Telegram-master"};
for(String s:projectSrc){
Project project = new Project();
project.setCodeUrl(s);
Inspector inspector = new Inspector(project,suffixLanguageMapping,ruleList);
Report inspect = inspector.inspect();
System.out.println("语言:"+inspect.getLanguage()+" 数据库:"+inspect.getDatabaseType()+" 依赖管理:"+inspect.getDependenceManagement());
for(Warn warn:inspect.getWarnList()){
System.out.println("\t"+warn);
}
}
System.out.println(LocalDateTime.now());
}
private Project project;
......@@ -39,11 +72,15 @@ public class Inspector {
private Map<String, Counter> languageMatchMap;
private Map<String, Report.Language> suffixLanguageMapping;
private List<Rule> ruleList;
private Map<String,List<Path>> configFileTypePathsMapping;
private List<Warn> warnList;
public Inspector(Project project,Map<String,Report.Language> suffixLanguageMapping){
public Inspector(Project project,Map<String,Report.Language> suffixLanguageMapping,List<Rule> ruleList){
this.project = project;
this.suffixLanguageMapping = suffixLanguageMapping;
this.ruleList = ruleList;
this.languageMatchMap = new HashMap<>();
for(String s:suffixLanguageMapping.keySet()){
languageMatchMap.put(s,new Counter());
......@@ -61,9 +98,11 @@ public class Inspector {
configFileTypePathsMapping.put("properties",new ArrayList<>());
configFileTypePathsMapping.put("yml",new ArrayList<>());
this.report = new Report();
this.warnList = new ArrayList<>();
}
int fileNum = 0;
long lineNum = 0;
/**
* FileVisitResult.CONTINUE 继续遍历
* FileVisitResult.TERMINATE 中止访问
......@@ -96,6 +135,7 @@ public class Inspector {
* 这里是对于路径(文件夹)的过滤,在这里读不到文件
* 如果能判断,可以返回FileVisitResult.SKIP_SUBTREE 不访问子目录
*/
//if (dir.endsWith(".git"))return FileVisitResult.SKIP_SUBTREE;
return FileVisitResult.CONTINUE;
}
......@@ -112,6 +152,22 @@ public class Inspector {
configFileTypePathsMapping.get(entry.getValue()).add(file);
}
}
List<String> allLines;
try {
allLines = Files.readAllLines(file);
}catch (MalformedInputException e){
return FileVisitResult.CONTINUE;
}
lineNum += allLines.size();
for(int i = 0;i<allLines.size();i++){
String s = allLines.get(i);
for(Rule rule:ruleList){
if (s.indexOf(rule.getTarget())>-1){
warnList.add(new Warn(file,i+1,rule.getTarget(),rule.getReplacing()));
}
}
}
//System.out.println(file);
return FileVisitResult.CONTINUE;
}
......@@ -134,6 +190,7 @@ public class Inspector {
public Report analysis(){
report.setFileNum(fileNum);
report.setLineNum(lineNum);
report.setLanguage(Report.Language.ONLYVIEW);
for(Map.Entry<String,Counter> entry:languageMatchMap.entrySet()){
if(entry.getValue().getNumber()>0){
......@@ -153,7 +210,7 @@ public class Inspector {
* 配置文件的一个类型,xml文件
*/
case "xml":
System.out.println(entry.getValue().size());
//System.out.println(entry.getValue().size());
for(Path path:entry.getValue()){
/**
* 对于maven工程,可以在maven配置文件中得到一这些信息
......@@ -171,6 +228,7 @@ public class Inspector {
e.printStackTrace();
}
Element elementProject = document.getRootElement();
String projectMavenName = elementProject.elementText("artifactId");
String projectMavenVersion = elementProject.elementText("version");
report.setPackagePath(path.getParent()+"/target/"+projectMavenName+"-"+projectMavenVersion+".war");
......@@ -178,7 +236,7 @@ public class Inspector {
}
break;
/**
* 配置文件的一个类型,properties文件
* properties文件
*
*/
case "properties":
......@@ -195,7 +253,7 @@ public class Inspector {
}
String datasourceDriver = properties.getProperty("spring.datasource.driver-class-name");
String active = properties.getProperty("spring.profiles.active");
System.out.println(path.getParent());
//System.out.println(path.getParent());
File file = new File(path.getParent().toString() + "/application-" + active + ".properties");
if (file.exists()) {
Properties properties1 = new Properties();
......@@ -224,6 +282,18 @@ public class Inspector {
}
break;
case "yml":
for(Path path:entry.getValue()) {
Yaml ymal = new Yaml();
Iterable<Object> objects = null;
try {
objects = ymal.loadAll(new FileInputStream(path.toFile()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
objects.forEach(o -> {
});
}
break;
}
}
......@@ -270,6 +340,7 @@ public class Inspector {
// e.printStackTrace();
// }
// }
report.setWarnList(warnList);
return report;
}
public class Counter {
......@@ -286,4 +357,19 @@ public class Inspector {
i = 0;
}
}
public class YmlConfig{
private String springDatasourceDriverClassName;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Warn{
private Path path;
private int line;
private String keyWord;
private String suggest;
}
}
......@@ -5,16 +5,13 @@ import com.zjty.adaptationmaster.adaptor.entity.Rule;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.tomcat.websocket.server.WsServerContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class ReadedFileTask implements Runnable {
......
package com.zjty.adaptationmaster;
public class YmlConfig {
public static void main(String[] args) {
String string = "";
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论