提交 4e7849c1 authored 作者: 马晨俊's avatar 马晨俊

git init

上级
HELP.md
target/
.mvn/**
**/lib/**
!**/src/main/**
!**/src/test/**
mvnw
mvnw.cmd
tree.txt
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea/**
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
### VS Code ###
.vscode/
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zjty</groupId>
<artifactId>inspect</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>inspect</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>5.2.1.201812262042-r</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>snakeyaml</artifactId>
<groupId>org.yaml</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.61</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.25</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.zjty.inspect;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class InspectApplication {
public static void main(String[] args) {
SpringApplication.run(InspectApplication.class, args);
}
}
package com.zjty.inspect.controller;
import com.zjty.inspect.entity.InspectParameter;
import com.zjty.inspect.entity.Report;
import com.zjty.inspect.service.InspectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
/**
* @author mcj
*/
@RestController
@RequestMapping("/inspect")
public class InspectController {
@Autowired
private InspectService inspectService;
@GetMapping("/path")
public ResponseEntity inspect(@RequestBody InspectParameter path){
//下载代码
//
InspectParameter inspectParameter = new InspectParameter();
return ResponseEntity.ok(inspectService.inspect(inspectParameter));
}
@PostMapping
public ResponseEntity inspect1(String path){
System.out.println(path);
return ResponseEntity.ok(200);
}
}
package com.zjty.inspect.controller;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@ServerEndpoint("/webServer/{uuid}")
@Component
@Slf4j
public class WebSocketServer {
private Logger logger = LoggerFactory.getLogger(getClass());
private static Map<String,WebSocketServer> map = new HashMap<>();
private Session session;
private String uuid;
@OnOpen
public void onOpen(Session session,@PathParam("uuid")String uuid){
this.session = session;
this.uuid = uuid;
//session.getOpenSessions().
//System.out.println("第一个" + uuid);
logger.info("uuid:"+uuid);
map.put(uuid,this);
try {
sendMessage("连接成功");
} catch (IOException e) {
logger.error("websocket IO异常");
}
logger.info("连接成功"+session.getId());
}
@OnClose
public void onClose(Session session){
map.remove(this.uuid);
logger.info("连接关闭"+session.getId());
}
@OnMessage
public void onMessage(Session session,String message){
// try {
//map.get(uuid).sendMessage(message);
logger.info(uuid+"sendMsg"+message);
// } catch (IOException e) {
// e.printStackTrace();
// }
}
@OnError
public void onError(Session session,Throwable error){
logger.info(error.getMessage());
error.printStackTrace();
}
/**
* 实现服务器主动推送
*/
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
public static void sendIn(String sessionId,String message) throws IOException {
//System.out.println(message);
try {
map.get(sessionId).sendMessage(message);
}catch (Exception e){
log.info("向前台发送日志出错");
//e.printStackTrace();
}
}
}
package com.zjty.inspect.entity;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @author Mcj
* @date 2020-02-18 11:19
*/
@Data
public class DepTree {
private String depName;
private List<DepTree> depTreeList = new ArrayList<>();
/**
* 0,未违规
* 1,违规
*/
private Integer violation = 0;
}
package com.zjty.inspect.entity;
import lombok.Data;
/**
* @author Mcj
* @date 2020-02-21 20:26
*/
@Data
public class DepTreeAndReport {
private String id;
private DepTree depTree;
}
package com.zjty.inspect.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
/**
* @author Mcj
* @date 2020-02-12 12:35
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class InspectParameter {
String path;
List<Rule> ruleList = new ArrayList<>();
}
package com.zjty.inspect.entity;
import lombok.Data;
@Data
public class Parent {
private String artifactId;
private String groupId;
private String version;
private String relativePath;
}
package com.zjty.inspect.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 前端返回视图
* 不需要入库
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PomAnalysis {
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<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;
import lombok.NoArgsConstructor;
/**
* 依赖
* 入库
*/
@NoArgsConstructor
@Data
public class PomDependency {
private String groupId = "";
private String artifactId = "";
private String version = "";
private String gradle = "";
/**
* 1:前端依赖
* 2:后端依赖
*/
private Integer type;
/*依赖类型,默认类型是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<PomDependency> parentDependencies;//
//private int reportId;
}
package com.zjty.inspect.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@NoArgsConstructor
@Data
public class ProjectPom {
private List<Properties> properties = new ArrayList<>();
private Parent parent;
private String modelVersion;
private String groupId;
private String artifactId;
private String packaging;
private String version;
private String name;
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;
}
package com.zjty.inspect.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zjty.inspect.utils.Inspector;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Report {
private Language language;
private String framework;
private int fileNum;
private long lineNum;
/**
* 取名,后端依赖
*/
private List<PomDependency> backend;
/**
* 取名。前端依赖
*/
private List<PomDependency> frontend;
@Transient
private List<Inspector.Warn> warnList;
private String compileFilePath;
public DependenceManagement dependenceManagement;
@ElementCollection
public List<String> jarPath;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
public enum DependenceManagement{
MAVEN,GRADLE,ANT
}
public enum Language{
JAVA,PYTHON,CPP,JSP,ASP,ONLYVIEW,UNKNOW,JAVASCRIPT,GO,VUE
}
}
package com.zjty.inspect.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Rule {
private String path;
private String target;
private String advice;
public Rule(String target,String advice){
this.target = target;
this.advice = advice;
}
}
package com.zjty.inspect.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
/**
* @author Mcj
* @date 2020-01-15 13:18
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VueBrowserslist {
List<String> production = new ArrayList<>();
List<String> development = new ArrayList<>();
}
package com.zjty.inspect.entity;
import com.fasterxml.jackson.annotation.JsonSetter;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.HashMap;
import java.util.Map;
/**
* @author Mcj
* @date 2020-01-15 11:18
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VueDep {
String name;
String version;
@JsonSetter("private")
String vuePrivate;
Map<String,String> dependencies = new HashMap<>();
Map<String,String> scripts = new HashMap<>();
Map<String,String> eslintConfig = new HashMap<>();
VueBrowserslist browserslist;
}
package com.zjty.inspect.service;
import com.zjty.inspect.entity.InspectParameter;
import com.zjty.inspect.entity.Report;
public interface InspectService {
Report inspect(InspectParameter inspectParameter);
}
package com.zjty.inspect.service.impl;
import com.alibaba.fastjson.JSON;
import com.zjty.inspect.entity.InspectParameter;
import com.zjty.inspect.entity.PomDependency;
import com.zjty.inspect.entity.Report;
import com.zjty.inspect.entity.Rule;
import com.zjty.inspect.service.InspectService;
import com.zjty.inspect.utils.Inspector;
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.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
@Service
public class InspectServiceImpl implements InspectService {
@Transactional
@Override
public Report inspect(InspectParameter inspectParameter) {
Map<String, Report.Language> suffixLanguageMapping = new HashMap<>();
suffixLanguageMapping.put("java", Report.Language.JAVA);
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("html", Report.Language.ONLYVIEW);
suffixLanguageMapping.put("js", Report.Language.JAVASCRIPT);
suffixLanguageMapping.put("go", Report.Language.GO);
List<Rule> ruleList = inspectParameter.getRuleList();
//com.mysql.cj.jdbc.Driver//com.mysql.jdbc.Driver
ruleList.add(new Rule("com.mysql.cj.jdbc.Driver", "建议修改为postgresql数据库驱动"));
ruleList.add(new Rule("com.mysql.jdbc.Driver", "建议修改为postgresql数据库驱动"));
//net.sourceforge.jtds.jdbc.Driver//sqlserver
ruleList.add(new Rule("net.sourceforge.jtds.jdbc.Driver", "建议修改为postgresql数据库驱动"));
//COM.ibm.db2.jdbc.app.DB2Driver//com.ibm.db2.jcc.DB2Driver//COM.ibm.db2.jdbc.net.DB2Driver//com.ibm.db2.jcc.DB2Driver
ruleList.add(new Rule("DB2Driver", "建议修改为postgresql数据库驱动"));
//oracle.jdbc.OracleDriver//oracle.jdbc.driver.OracleDriver
ruleList.add(new Rule("OracleDriver", "建议修改为postgresql数据库驱动"));
ruleList.add(new Rule("mysql-connector-java", "建议修改为postgresql依赖声明"));
ruleList.add(new Rule("com.microsoft.sqlserver", "建议修改为postgresql依赖声明"));
ruleList.add(new Rule("com.oracle", "建议修改为postgresql依赖声明"));
ruleList.add(new Rule("org.mariadb.jdbc", "建议修改为postgresql依赖声明"));
ruleList.add(new Rule("com.sap.cloud.db.jdbc", "建议修改为postgresql依赖声明"));
ruleList.add(new Rule("com.ibm.informix", "建议修改为postgresql依赖声明"));
ruleList.add(new Rule("org.firebirdsql.jdbc", "建议修改为postgresql依赖声明"));
ruleList.add(new Rule("org.hsqldb", "建议修改为postgresql依赖声明"));
ruleList.add(new Rule("com.h2database", "建议修改为postgresql依赖声明"));
ruleList.add(new Rule("org.apache.derby", "建议修改为postgresql依赖声明"));
ruleList.add(new Rule("org.mongodb", "建议修改为postgresql依赖声明"));
ruleList.add(new Rule("package.json", "需要nodejs环境"));
ruleList.add(new Rule("public native", "这里用到了JNI"));
ruleList.add(new Rule("<packaging>jar</packaging>", "建议修改打包方式为war包并排除掉springboot内置的tomcat,以部署到国产化中间件上"));
ruleList.add(new Rule("WebOffice", "这里用到了weboffice文档展示编辑插件"));
ruleList.add(new Rule("webOffice", "这里用到了weboffice文档展示编辑插件"));
ruleList.add(new Rule("weboffice", "这里用到了weboffice文档展示编辑插件"));
ruleList.add(new Rule("Weboffice", "这里用到了weboffice文档展示编辑插件"));
ruleList.add(new Rule("pdfobject.min.js", "这里用到了pdf文档展示插件"));
ruleList.add(new Rule("pdfobject.js", "这里用到了pdf文档展示插件"));
ruleList.add(new Rule(".swf", "这里用到了flash流媒体播放插件"));
String path = inspectParameter.getPath();
//调用下载服务下载源代码
Report report = notList(path, suffixLanguageMapping, ruleList);
return report;
}
public void listfile(String path,Map<String, Report.Language> suffixLanguageMapping,List<Rule> ruleList){
Path path1 = Paths.get(path);
File file = path1.toFile();
File[] files = file.listFiles();
System.out.println(file.isDirectory());
for (File file1 : files) {
Report report = new Inspector(file1.getPath(), suffixLanguageMapping, ruleList).inspect();
File file2 = new File(file1.getPath() + "/评估报告" + file1.getName() + ".txt");
try {
FileWriter writer = new FileWriter(file2);
writer.write("系统名称:" + file1.getName() + "\n");
writer.write("评估时间:" + new Date() + "\n\n");
writer.write("语言:" + report.getLanguage() + "\t");
writer.write("依赖管理工具:" + report.getDependenceManagement() + "\t");
writer.write("架构:" + report.getFramework() + "\n");
writer.write("文件数量:" + report.getFileNum() + "\t");
writer.write("代码行数:" + report.getLineNum() + "\n\n");
writer.write("后端依赖列表:\n");
for (PomDependency dependency : report.getBackend()) {
writer.write("" + dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getVersion() + ":" + dependency.getGradle() + "\n");
}
writer.write("\n前端依赖列表:\n");
for (PomDependency dependency : report.getFrontend()) {
writer.write("" + dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getVersion() + ":");
}
int j = 1;
for (Inspector.Warn warn : report.getWarnList()) {
writer.write(j++ + "、所在文件:" + warn.getPath() + " 行数:" + warn.getLine() + "行 关键字:" + warn.getKeyWord() + "\n"
+ "建议:" + warn.getSuggest());
}
writer.close();
} catch (IOException e) {
}
}
}
public Report notList(String path,Map<String, Report.Language> suffixLanguageMapping,List<Rule> ruleList){
Path path1 = Paths.get(path);
File file = path1.toFile();
File file2 = new File(file.getPath() + "/评估报告" + file.getName() + ".txt");
if (file2.exists()){
file2.delete();
}
Report report = new Inspector(file.getPath(), suffixLanguageMapping, ruleList).inspect();
try {
FileWriter writer = new FileWriter(file2);
writer.write("系统名称:" + file.getName() + "\n");
writer.write("评估时间:" + new Date() + "\n\n");
writer.write("语言:" + report.getLanguage() + "\t");
writer.write("依赖管理工具:" + report.getDependenceManagement() + "\t");
writer.write("架构:" + report.getFramework() + "\n");
writer.write("文件数量:" + report.getFileNum() + "\t");
writer.write("代码行数:" + report.getLineNum() + "\n\n");
writer.write("后端依赖列表:\n");
for (PomDependency dependency : report.getBackend()) {
writer.write("" + dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getVersion() + ":" + dependency.getGradle() + "\n");
}
writer.write("\n前端依赖列表:\n");
for (PomDependency dependency : report.getFrontend()) {
writer.write("" + dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getVersion() + ":");
}
int j = 1;
for (Inspector.Warn warn : report.getWarnList()) {
writer.write(j++ + "、所在文件:" + warn.getPath() + " 行数:" + warn.getLine() + "行 关键字:" + warn.getKeyWord() + "\n"
+ "建议:" + warn.getSuggest());
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
return report;
}
}
package com.zjty.inspect.utils;
import com.alibaba.fastjson.JSONObject;
import com.zjty.inspect.entity.*;
import com.zjty.inspect.entity.Properties;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
public class AnalysisFile {
public static ProjectPom analysisPom(Path pomPath){
ProjectPom projectPom = new ProjectPom();
List<PomDependency> dependencies = new ArrayList<>();
Document document = null;
try {
document = DocumentHelper.parseText(new String(Files.readAllBytes(pomPath)));
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Element rootElement = document.getRootElement();
if(rootElement.element("properties")!=null){
Element dependencies1 = rootElement.element("properties");
for(Element element:dependencies1.elements()){
Properties properties = new Properties();
String name = element.getName();
String stringValue = element.getStringValue();
properties.setValue(stringValue);
properties.setName(name);
projectPom.getProperties().add(properties);
}
}
projectPom.setModelVersion(rootElement.elementText("modelVersion"));
projectPom.setGroupId(rootElement.elementText("groupId"));
projectPom.setArtifactId(rootElement.elementText("artifactId"));
projectPom.setPackaging(rootElement.elementText("packing"));
projectPom.setVersion(rootElement.elementText("version"));
if(rootElement.elementText("version")!=null){
projectPom.setVersion(rootElement.elementText("version"));
}
projectPom.setName(rootElement.elementText("name"));
projectPom.setDescription(rootElement.elementText("description"));
if(rootElement.element("dependencies")!=null){
Element dependencies1 = rootElement.element("dependencies");
List<Element> dependency = dependencies1.elements("dependency");
for(Element element:dependency){
PomDependency pomDependency = new PomDependency();
pomDependency.setGroupId(element.elementText("groupId"));
pomDependency.setArtifactId(element.elementText("artifactId"));
if(element.elementText("version")!=null){
pomDependency.setVersion(element.elementText("version"));
}
dependencies.add(pomDependency);
}
}
if(rootElement.elements("parent")!=null){
List<Element> parent = rootElement.elements("parent");
for(Element p:parent){
PomDependency pomDependency = new PomDependency();
pomDependency.setGroupId(p.elementText("groupId"));
pomDependency.setArtifactId(p.elementText("artifactId"));
if(p.elementText("version")!=null){
pomDependency.setVersion(p.elementText("version"));
}
dependencies.add(pomDependency);
}
}
if(rootElement.element("dependencyManagement")!=null){
Element dependencies1 = rootElement.element("dependencyManagement");
Element dependencies2 = dependencies1.element("dependencies");
List<Element> dependency = dependencies2.elements("dependency");
for(Element element:dependency){
PomDependency pomDependency = new PomDependency();
pomDependency.setGroupId(element.elementText("groupId"));
pomDependency.setArtifactId(element.elementText("artifactId"));
if(element.elementText("version")!=null){
pomDependency.setVersion(element.elementText("version"));
}
dependencies.add(pomDependency);
}
}
projectPom.setDependencies(dependencies);
return projectPom;
}
public static List<PomDependency> analysisGradle(Path pomPath) {
List<String> strings = null;
try {
strings = Files.readAllLines(pomPath);
} catch (IOException e) {
e.printStackTrace();
}
List<PomDependency> dependencies = new ArrayList<>();
for (String string : strings) {
if(string.indexOf("compile")>0){
PomDependency pomDependency = new PomDependency();
int compile = string.indexOf("compile");
int i = compile + 8;
String substring = string.substring(i);
pomDependency.setGradle(substring);
dependencies.add(pomDependency);
}
}
return dependencies;
}
public static void main(String[] args) {
Path path = Paths.get("/Users/mcj/IdeaProjects/inspect/tree.txt");
int is=0;
boolean b1 = path.toString().endsWith("");
HashMap<Integer, DepTree> map = new HashMap<>();
int one = 1;
DepTree depTree = new DepTree();
try {
List<String> strings = Files.readAllLines(path);
String s1 = strings.get(7);
String s2 = s1.replaceAll("\\[INFO] ", "");
depTree.setDepName(s2);
map.put(1,depTree);
int now = 0;
for (int i = 8; i <= strings.size()-7; i++) {
DepTree depTree1 = new DepTree();
String s = strings.get(i).replaceAll("\\[INFO] ", "");
int i1 = s.indexOf("-");
if(i1==one){
depTree1.setDepName(s);
depTree.getDepTreeList().add(depTree1);
}else{
if(i1>now){
depTree1.setDepName(s);
map.get(i1).getDepTreeList().add(depTree1);
}else{
depTree1.setDepName(s);
map.get(i1).getDepTreeList().add(depTree1);
}
}
map.put(i1+3,depTree1);
now = i1;
}
DepTreeAndReport depTreeAndReport = new DepTreeAndReport();
depTreeAndReport.setId("报告id");
depTreeAndReport.setDepTree(depTree);
Object o = JSONObject.toJSON(depTreeAndReport);
System.out.println(o);
} catch (IOException e) {
e.printStackTrace();
}
String a = "AAbaaa";
String b = "cccccaaB";
boolean aaB = a.equalsIgnoreCase("aaB");
int aaB1 = b.indexOf("aaB");
int i = AnalysisFile.EditDistance(a, b);
System.out.println(i);
}
public static int EditDistance(String source, String target) {
char[] sources = source.toCharArray();
char[] targets = target.toCharArray();
int sourceLen = sources.length;
int targetLen = targets.length;
int[][] d = new int[sourceLen + 1][targetLen + 1];
for (int i = 0; i <= sourceLen; i++) {
d[i][0] = i;
}
for (int i = 0; i <= targetLen; i++) {
d[0][i] = i;
}
for (int i = 1; i <= sourceLen; i++) {
for (int j = 1; j <= targetLen; j++) {
if (sources[i - 1] == targets[j - 1]) {
d[i][j] = d[i - 1][j - 1];
} else {
//插入
int insert = d[i][j - 1] + 1;
//删除
int delete = d[i - 1][j] + 1;
//替换
int replace = d[i - 1][j - 1] + 1;
d[i][j] = Math.min(insert, delete) > Math.min(delete, replace) ? Math.min(delete, replace) :
Math.min(insert, delete);
}
}
}
return d[sourceLen][targetLen];
}
}
package com.zjty.inspect.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zjty.inspect.entity.Report;
import com.zjty.inspect.entity.VueDep;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.*;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class FileUtil {
static int BUFFER_SIZE = 1024;
/**
* zip解压
*
* @param srcFile zip源文件
* @param destDirPath 解压后的目标文件夹
* @throws RuntimeException 解压失败会抛出运行时异常
*/
public static void unZip(File srcFile, String destDirPath) throws RuntimeException {
long start = System.currentTimeMillis();
// 判断源文件是否存在
if (!srcFile.exists()) {
throw new RuntimeException(srcFile.getPath() + "所指文件不存在");
}
// 开始解压
ZipFile zipFile = null;
try {
zipFile = new ZipFile(srcFile);
Enumeration<?> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
System.out.println("解压" + entry.getName());
// 如果是文件夹,就创建个文件夹
if (entry.isDirectory()) {
String dirPath = destDirPath + "/" + entry.getName();
File dir = new File(dirPath);
dir.mkdirs();
} else {
// 如果是文件,就先创建一个文件,然后用io流把内容copy过去
File targetFile = new File(destDirPath + "/" + entry.getName());
// 保证这个文件的父文件夹必须要存在
if (!targetFile.getParentFile().exists()) {
targetFile.getParentFile().mkdirs();
}
targetFile.createNewFile();
// 将压缩文件内容写入到这个文件中
InputStream is = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(targetFile);
int len;
byte[] buf = new byte[BUFFER_SIZE];
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
// 关流顺序,先打开的后关闭
fos.close();
is.close();
}
}
long end = System.currentTimeMillis();
System.out.println("解压完成,耗时:" + (end - start) + " ms");
} catch (Exception e) {
throw new RuntimeException("unzip error from ZipUtils", e);
} finally {
if (zipFile != null) {
try {
zipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private static void recursiveFiles(String path) {
// 创建 File对象
File file = new File(path);
// 取 文件/文件夹
File files[] = file.listFiles();
// 对象为空 直接返回
if (files == null) {
return;
}
// 存在文件 遍历 判断
for (File f : files) {
// 判断是否为 文件夹
if (f.isDirectory()) {
// 为 文件夹继续遍历
recursiveFiles(f.getAbsolutePath());
// 判断是否为 文件
} else if (f.isFile()) {
if ("pom.xml".equals(f.getName())) {
System.out.println("解析pom");
}
System.out.println(f.getName());
// System.out.println(f.getAbsolutePath());
} else {
System.out.print("未知错误文件");
}
}
}
static VueDep parseJsonFile(String path) {
try {
File file = new File(path);
VueDep vueDep;
vueDep = new ObjectMapper().readValue(file,VueDep.class);
return vueDep;
} catch (Exception e) {
return null;
}
}
public static void main(String[] args) throws IOException {
File file = new File("/Users/mcj/Downloads/package.json");
VueDep vueDep = new ObjectMapper().readValue(file, VueDep.class);
System.out.println(vueDep);
SAXReader reader = new SAXReader();
Document document = null;
}
}
package com.zjty.inspect.utils;
import org.eclipse.jgit.api.CloneCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import java.io.File;
/**
* @author Mcj
* @date 2020-02-13 16:01
*/
public class GitLabUtil {
String downLoadProject(String path) {
//String REMOTE_URL = "https://git.yfzx.zjtys.com.cn:8888/912-system/monitor/adaptation-master.git";
CloneCommand cloneCommand = Git.cloneRepository();
cloneCommand.setURI(path);
// cloneCommand.setCredentialsProvider(mcj);
cloneCommand.setDirectory(new File("/Users/mcj/IdeaProjects/test5"));
try {
cloneCommand.call();
} catch (GitAPIException e) {
e.printStackTrace();
}
// try {
// cloneCommand.setTransportConfigCallback(new TransportConfigCallback() {
// @Override
// public void configure(Transport transport) {
// }
// }).call();
// } catch (GitAPIException e) {
// e.printStackTrace();
// }
// System.out.println("Listing remote repository " + REMOTE_URL);
// try {
// refs = Git.lsRemoteRepository()
// .setHeads(true)
// .setTags(true)
// .setRemote(REMOTE_URL)
// .call();
// } catch (GitAPIException ex) {
// ex.printStackTrace();
// }
return "";
}
}
package com.zjty.inspect.utils;
/**
* @author Mcj
* @date 2020-02-25 13:35
*/
public class KmpUtil {
/**
* 求出一个字符数组的next数组
* @param t 字符数组
* @return next数组
*/
public static int[] getNextArray(char[] t) {
int[] next = new int[t.length];
next[0] = -1;
next[1] = 0;
int k;
for (int j = 2; j < t.length; j++) {
k=next[j-1];
while (k!=-1) {
if (t[j - 1] == t[k]) {
next[j] = k + 1;
break;
}
else {
k = next[k];
}
next[j] = 0; //当k==-1而跳出循环时,next[j] = 0,否则next[j]会在break之前被赋值
}
}
return next;
}
/**
* 对主串s和模式串t进行KMP模式匹配
* @param s 主串
* @param t 模式串
* @return 若匹配成功,返回t在s中的位置(第一个相同字符对应的位置),若匹配失败,返回-1
*/
public static int kmpMatch(String s, String t){
char[] s_arr = s.toCharArray();
char[] t_arr = t.toCharArray();
int[] next = getNextArray(t_arr);
int i = 0, j = 0;
while (i<s_arr.length && j<t_arr.length){
if(j == -1 || s_arr[i]==t_arr[j]){
i++;
j++;
}
else{
j = next[j];
}
}
if(j == t_arr.length) {
return i - j;
}
else {
return -1;
}
}
public static void main(String[] args) {
System.out.println(kmpMatch("abcabaabaabcacb", "abaabcac"));
}
}
package com.zjty.inspect.utils;
import java.time.LocalDateTime;
public class TimeUtil {
public static String getNowDate(){
LocalDateTime date = LocalDateTime.now();
return date.getHour() + ":" + date.getMinute() + ":" + date.getSecond();
}
}
# 配置文件使用 默认使用 dev 环境
spring.profiles.active=dev
#spring.profiles.active=doc
#spring.profiles.active=prod
# 服务器相关配置
server.port=8079
# 日志文件相关配置
# logging.level.org.hibernate.sql=debug
logging.file.path=./log/master.log
#logging.file=./log/master.log
#spring.datasource.url=jdbc:mysql://localhost:3306/adapt?useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true&characterEncoding=utf-8
#spring.datasource.username=root
#spring.datasource.password=root
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
# spring-data-jpa 相关配置
# 指jpa对表生成的策略
spring.jpa.hibernate.ddl-auto=update
# 是否显示sql语句
spring.jpa.show-sql=false
# 格式化sql
#spring.jpa.properties.hibernate.format_sql=true
spring.jpa.open-in-view=true
# 验证框架是否对数据操作验证
spring.jpa.properties.javax.persistence.validation.mode=none
# spring-http-文件上传相关配置
spring.servlet.multipart.max-file-size=200MB
spring.servlet.multipart.max-request-size=200MB
#配置时间格式
spring.jacksondate-format = yyyy-MM-dd HH:mm:ss
spring.thymeleaf.cache=false
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/uploads/
#highgo
#highgo.driver=org.postgresql.Driver
#highgo.connectionType=postgresql
#highgo.dbName=template1
#driverweb=C:/Program Files/driver/geckodriver.exe
#testCaseExcelTable=C:/Users/admin/Desktop/test.xls
#createTxtPath=C:/
# mysql数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://192.168.1.249:3306/bservice?useSSL=false&serverTimezone=UTC&autoReconnect=true&characterEncoding=utf-8
spring.datasource.url=jdbc:mysql://localhost:3306/adaptation?useSSL=false&serverTimezone=UTC&autoReconnect=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论