提交 6f4c2dca authored 作者: wyl's avatar wyl

合并分支 'wyl' 到 'master'

Wyl 查看合并请求 !1
流水线 #1 已失败 于阶段
cache:
paths:
- /home/czq/
stages:
- build
- test
- deploy
job 1:
stage: build
script:
- echo "编译中。。。。"
- "mvn clean compile"
only:
- master
tags:
- czq-Runner
job 2:
stage: test
script:
- echo "打包中。。。。"
- "mvn clean package"
only:
- master
tags:
- czq-Runner
job 3:
stage: deploy
script:
- echo "部署中。。。。"
- "java -jar adaptation-master-0.0.1-SNAPSHOT.jar"
only:
- master
tags:
- czq-Runner
#variables:
# MAVEN_OPTS: "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
# MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
#
##定义后续运行之间应缓存的文件列表
#cache:
# paths:
# - /data/tools/maven3/repo
##验证
#.validate: &validate
# stage: build
# script:
# - 'mvn $MAVEN_CLI_OPTS test-compile'
#
##核实
#.verify: &verify
# stage: test
# script:
# - 'mvn $MAVEN_CLI_OPTS verify'
# only:
# - master
#
#validate:jdk8:
# <<: *validate
# image: maven:3.5.2-jdk-8
#
#verify:jdk8:
# <<: *verify
# image: maven:3.5.2-jdk-8
#
#install:jdk8:
# stage: test
# script:
# - '/data/tools/maven3/bin/mvn clean package -U install'
# only:
# - master
# image: maven:3.5.2-jdk-8
#
#deploy:jdk8:
# image: busybox:latest
# stage: deploy
# script:
# - '/data/tools/maven3/bin/mvn deploy'
# dependencies:
# - install:jdk8
# only:
# - master
\ No newline at end of file
......@@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zjty</groupId>
......@@ -22,8 +22,35 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>snakeyaml</artifactId>
<groupId>org.yaml</groupId>
</exclusion>
</exclusions>
</dependency>
<!--webSocket 后台向前端推送消息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
......@@ -50,11 +77,11 @@
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.data</groupId>-->
<!-- <artifactId>spring-data-jpa</artifactId>-->
<!-- <version>2.2.1.RELEASE</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.data</groupId>-->
<!-- <artifactId>spring-data-jpa</artifactId>-->
<!-- <version>2.2.1.RELEASE</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
......@@ -69,10 +96,15 @@
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>4.3.17.RELEASE</version>
<!-- <version>4.3.17.RELEASE</version>-->
</dependency>
<dependency>
<groupId>junit</groupId>
......@@ -89,6 +121,79 @@
<artifactId>jpa-spec</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-invoker</artifactId>
<version>3.0.1</version>
<exclusions>
<exclusion>
<artifactId>commons-io</artifactId>
<groupId>commons-io</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>build210</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.25</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.apache.zookeeper</groupId>-->
<!-- <artifactId>zookeeper</artifactId>-->
<!-- <version>3.3.4</version>-->
<!-- </dependency>-->
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.9.7</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1-beta-8</version>
</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,10 @@ 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;
@SpringBootApplication
@EnableScheduling
public class AdaptationMasterApplication {
public static void main(String[] args) {
......
package com.zjty.adaptationmaster.adaptor.enginer;
package com.zjty.adaptationmaster.adaptor;
import com.zjty.adaptationmaster.adaptor.entity.Rule;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;
/**
* @author Mcj
* @date 2020-01-15 13:18
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ReadedFile {
private String content;
private BasicFileAttributes attributes;
private Path path;
private List<Rule> thisMatchedRule;
@NoArgsConstructor
public class VueBrowserslist {
List<String> production = new ArrayList<>();
List<String> development = new ArrayList<>();
}
package com.zjty.adaptationmaster.adaptor.controller;
import com.alibaba.fastjson.JSON;
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.adaptor.service.AdaptationService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
@RestController
@RequestMapping("/adapt")
public class AdaptationController {
@GetMapping("/getUUID")
public ServerResponse getUUID(){
return ServerResponse.success(UUID.randomUUID().toString());
}
@Autowired
private AdaptationService adaptationService;
@PostMapping("/adapt")
public ServerResponse adapt(@RequestBody AdaptRequest adaptRequest) throws IOException {
return adaptationService.adapt(adaptRequest.getProject(),adaptRequest.getRuleList(),adaptRequest.getUuid());
}
@PostMapping("/compile")
public ServerResponse compile(@RequestBody AdaptRequest adaptRequest){
System.out.print("编译");
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());
}
@PostMapping("/startInApusic")
public ServerResponse startInApusic(@RequestBody AdaptRequest adaptRequest){
return adaptationService.start(adaptRequest.getProject(),adaptRequest.getUuid());
}
@PostMapping("/stopInApusic")
public ServerResponse stopInApusic(@RequestBody AdaptRequest adaptRequest){
return adaptationService.stop(adaptRequest.getProject(),adaptRequest.getUuid());
}
@PostMapping("/unzipProject")
public ServerResponse unZipProject(@RequestBody AdaptRequest adaptRequest){
return adaptationService.unZipProject(adaptRequest.getPath(),adaptRequest.getProject());
}
}
......@@ -34,9 +34,9 @@ public class AssemblyController {
return assemblyService.deleteAssembly(id);
}
@PostMapping("/{page}")
public ServerResponse findAssembly(@PathVariable("page") Integer page ,@RequestBody Assembly assembly){
return assemblyService.findAssembly(page,assembly);
@PostMapping
public ServerResponse findAssembly(@RequestBody Assembly assembly){
return assemblyService.findAssembly(0,assembly);
}
}
package com.zjty.adaptationmaster.adaptor.controller;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.io.IOException;
@Controller
@RequestMapping("/checkcenter")
public class CheckCenterController {
//页面请求
@GetMapping("/socket/{cid}")
public ModelAndView socket(@PathVariable String cid) {
ModelAndView mav=new ModelAndView("/socket");
mav.addObject("cid", cid);
return mav;
}
//推送数据接口
@ResponseBody
@RequestMapping("/socket/push/{cid}")
public ServerResponse pushToWeb(@PathVariable String cid, String message) {
// try {
// WebSocketServer.sendInfo(cid,message);
// } catch (IOException e) {
// e.printStackTrace();
// return ServerResponse.error(cid+"#"+e.getMessage());
// }
return ServerResponse.success(cid);
}
}
package com.zjty.adaptationmaster.adaptor.controller;
import com.zjty.adaptationmaster.adaptor.entity.db.DBDeleteResponse;
import com.zjty.adaptationmaster.adaptor.entity.db.DBManage;
import com.zjty.adaptationmaster.adaptor.service.DBManageService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/database")
public class DBManageController {
@Autowired
private DBManageService databaseService;
@PostMapping("/save")
public ServerResponse add(@RequestBody DBManage databaseManagement){
return databaseService.saveDatabase(databaseManagement);
}
@PutMapping("/delete/{id}")
public ServerResponse delete(@PathVariable("id") Integer id){
return databaseService.deleteDatabase(id);
}
@GetMapping("/find")
public ServerResponse findDatabaseManagement(){
return databaseService.findDatabase();
}
@PutMapping("/deleteDB")
public ServerResponse deleteDB(@RequestBody DBDeleteResponse dbDeleteResponse){
return databaseService.deleteDB(dbDeleteResponse);
}
}
package com.zjty.adaptationmaster.adaptor.controller;
import com.zjty.adaptationmaster.adaptor.entity.db.DatabaseResponse;
import com.zjty.adaptationmaster.adaptor.service.DBMigrateService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RequestMapping("/dbMigrate")
@RestController
public class DBMigrateController {
@Autowired
private DBMigrateService dbMigrateService;
@PostMapping("/migrate")
public ServerResponse addDatabase(@RequestBody DatabaseResponse databaseResponse){
return dbMigrateService.dbMigrate(databaseResponse);
}
@PutMapping("/find")
public ServerResponse find(@RequestBody Integer id){
return dbMigrateService.findDBByDBType(id);
}
}
package com.zjty.adaptationmaster.adaptor.controller;
import com.zjty.adaptationmaster.adaptor.entity.db.DBRecordPage;
import com.zjty.adaptationmaster.adaptor.service.DBRecordService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/dbRecord")
public class DBRecordController {
@Autowired
private DBRecordService dbRecordService;
@PutMapping("/page")
public ServerResponse page(@RequestBody DBRecordPage dbRecordPage){
return dbRecordService.pageFind(dbRecordPage);
}
}
......@@ -6,6 +6,7 @@ import com.zjty.adaptationmaster.base.response.ServerResponse;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
/**
......@@ -26,8 +27,8 @@ public class DependencyController {
}
@PostMapping
public ServerResponse saveDependency(@RequestBody Dependency dependency , MultipartHttpServletRequest request){
return dependencyService.saveDependency(dependency,request);
public ServerResponse saveDependency(Dependency dependency , @RequestParam("dependency") MultipartFile file){
return dependencyService.saveDependency(dependency,file);
}
@DeleteMapping("/{id}")
......
package com.zjty.adaptationmaster.adaptor.controller;
import com.zjty.adaptationmaster.adaptor.service.FileUploadService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/file")
public class FileUploadController {
@Autowired
private FileUploadService fileUploadService;
//文件上传
@PutMapping("/upload")
public ServerResponse fileUpload(HttpServletRequest httpServletRequest){
return fileUploadService.fileUpload(httpServletRequest);
}
}
package com.zjty.adaptationmaster.adaptor.controller;
import com.zjty.adaptationmaster.adaptor.entity.AdaptRequest;
import com.zjty.adaptationmaster.adaptor.entity.Project;
import com.zjty.adaptationmaster.adaptor.entity.Report;
import com.zjty.adaptationmaster.adaptor.service.InspectService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/inspect")
public class InspectController {
@Autowired
private InspectService inspectService;
@PutMapping("/inspect")
public ServerResponse inspect(@RequestBody AdaptRequest adaptRequest){
return inspectService.inspect(adaptRequest.getProject(),adaptRequest.getUuid());
}
@GetMapping("/{id}")
public ResponseEntity report(@PathVariable Integer id){
return ResponseEntity.ok(inspectService.getReportById(id));
}
@GetMapping("/print/{id}")
public ResponseEntity printReport(@PathVariable Integer id){
return ResponseEntity.ok(inspectService.getPrintReport(id));
}
}
package com.zjty.adaptationmaster.adaptor.controller;
import com.alibaba.fastjson.JSON;
import com.zjty.adaptationmaster.adaptor.entity.Project;
import com.zjty.adaptationmaster.adaptor.service.ProjectService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
......@@ -27,6 +28,8 @@ public class ProjectController {
@PutMapping
public ServerResponse saveProject(@RequestBody Project project){
System.out.print("添加或修改项目");
System.out.println(JSON.toJSONString(project));
return projectService.saveProject(project);
}
......@@ -40,4 +43,14 @@ public class ProjectController {
return projectService.findProject(page,project);
}
@PostMapping("/getProjectState")
public ServerResponse getProjectState(){
return projectService.deployList();
}
@PostMapping("/downLoad")
public ServerResponse downLoad(@RequestBody Project project){
return projectService.downLoad(project);
}
}
package com.zjty.adaptationmaster.adaptor.controller;
import com.alibaba.fastjson.JSONObject;
import com.zjty.adaptationmaster.adaptor.entity.Report;
import com.zjty.adaptationmaster.adaptor.repository.ReportDao;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
@RestController
@RequestMapping("/send")
public class Test {
@Autowired
private ReportDao reportDao;
@PutMapping("/test/{uuid}")
public ServerResponse test(@PathVariable String uuid){
JSONObject jo = new JSONObject();
jo.put("message", "这是后台返回的消息!");
try {
WebSocketServer.sendIn(uuid,JSONObject.toJSONString(jo));
} catch (Exception e) {
e.printStackTrace();
}
return ServerResponse.success();
}
}
package com.zjty.adaptationmaster.adaptor.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.time.LocalDateTime;
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.adaptationmaster.adaptor.enginer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdaptorEntity {
/**
* 匹配模式及处理方式
* 文件匹配模式
* https://blog.csdn.net/qq_36263601/article/details/74260553
* 文本位置匹配模式
* 全文匹配
* 文本处理模式
* 全文替换
*/
private MatchType matchType;//匹配方式
private String parent;//文件路径匹配
private String matching;//文本匹配
private String replacing;//更改方式
}
package com.zjty.adaptationmaster.adaptor.enginer;
public class Counter {
private int i = 0;
public void plus(){
i++;
}
public int getI() {
return i;
}
public void reset(){
i = 0;
}
}
package com.zjty.adaptationmaster.adaptor.enginer;
import org.apache.commons.io.FileUtils;
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.*;
public class Engine {
//判断一个文件够不够称作大文件的阈值,大文件单独占用一个线程,小文件凑够阈值合用一个线程
private final static long LIMIT = 200*1024;
private String path;
private String projectName;
private List<AdaptorEntity> adaptorEntities;
private ThreadPoolExecutor pool;
public int threadNum;
public void setPath(String path) {
this.path = path;
}
public void setProjectName(String name){
this.projectName = name;
}
public void initAdaptorEntities(List adaptorEntities){
this.adaptorEntities = adaptorEntities;
}
public void setThreadNum(int threadNum) {
this.threadNum = threadNum;
}
public void addAdaptorEntities(List adaptorEntities){
if(this.adaptorEntities == null)this.adaptorEntities = new ArrayList<>();
this.adaptorEntities.addAll(adaptorEntities);
}
long beginTime ;
public void enginer(){
pool = new ThreadPoolExecutor(threadNum, threadNum, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(400));
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
beginTime = System.currentTimeMillis();
System.out.println(beginTime+"开始时间,线程池数量"+threadNum);
doDir(path);
pool.shutdown();
try {
//该方法会被阻塞,直到子线程全部执行完毕,并且shutdown()方法被调用,或者等待时间超时。这里等待时间设置一小时
pool.awaitTermination(1,TimeUnit.HOURS);
} catch (InterruptedException e) {
e.printStackTrace();
}
long l = System.currentTimeMillis();
System.out.println("所有线程执行完毕"+l+"总时间差"+(l-beginTime));
}
final Counter i = new Counter();
SmallFileRepository repository = new SmallFileRepository();
private void doDir(String path){
//final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:**/*.{java,txt,properties}");
//Collection<File> files = FileUtils.listFiles(new File(path), null, true);
Iterator<File> fileIterator = FileUtils.iterateFiles(new File(path), new String[]{"java","txt","properties"}, true);
while (fileIterator.hasNext()){
File next = fileIterator.next();
long length = next.length();
if(length>LIMIT) {
System.out.println("大文件出没");
List<File> files = new ArrayList<>();
files.add(next);
execute(files);
} else {
repository.fileList.add(next);
repository.length+=length;
if(repository.length>LIMIT){
execute(repository.fileList);
repository.length=0;
repository.fileList = new ArrayList<>();
}
}
i.plus();
//List<String> stringList = FileUtils.readLines(fileIterator.next(), "utf-8");
//execute(stringFactory);
}
// try {
// Files.walkFileTree(Paths.get(path),new SimpleFileVisitor<Path>(){
// @Override
// public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
//
// StringTask task = new StringTask(file,pathMatcher);
// execute(task);
// i.plus();
// //过滤文件名后缀
//// if(pathMatcher.matches(file)){
//// i.plus();
//// List<String> list = Files.readAllLines(file);
//// if(list.size()>200){
//// //System.out.println("文件够大,开线程"+file);
//// execute(new StringFactory().setProduct(list));
//// //new StringFactory().setProduct(list).run();
//// }else {
//// //System.out.println("文件不够大,存起来"+file);
//// stringList.addAll(list);
//// if(stringList.size()>200){
//// //System.out.println("存够了,开线程");
//// ArrayList<String> strings = new ArrayList<>();
//// strings.addAll(stringList);
//// execute(new StringFactory().setProduct(strings));
//// //new StringFactory().setProduct(strings).run();
//// stringList.clear();
//// }
//// }
//// }
// return FileVisitResult.CONTINUE;
// }
// @Override
// public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
// return FileVisitResult.CONTINUE;
// }
//};
// if(stringList.size()>0){
// ArrayList<String> strings = new ArrayList<>();
// strings.addAll(stringList);
// execute(new StringFactory().setProduct(strings));
// //new StringFactory().setProduct(strings).run();
// }
long endTime = System.currentTimeMillis();
System.out.println(endTime+"结束时间");
System.out.println(i.getI()+"处理总数量");
System.out.println((endTime-beginTime)+"时间差");
i.reset();
}
List<Runnable> rejectedTask = new ArrayList<>();
private void execute(List<File> files){
// ApacheTask stringFactory = new ApacheTask();
// stringFactory.setFile(files);
// pool.submit(stringFactory);
}
/**
* 文件如果过小,先存起来,大小存够了再交给一个线程去处理
*/
private class SmallFileRepository{
public long length = 0;
public List<File> fileList = new ArrayList<>();
}
public static void main(String[] args) {
Engine engine = new Engine();
engine.setPath("C:\\Users\\wyl\\Desktop\\testReplace");
//engine.setPath("C:\\Users\\wyl\\Desktop\\testReplace\\testReplace1\\java\\com\\zjty\\hrmanager\\base\\request");
engine.setProjectName("testReplace");
List<AdaptorEntity> adaptorEntities = new ArrayList<>();
adaptorEntities.add(new AdaptorEntity(MatchType.ALL,"**/resources/*.properties","log4j","log5j"));
engine.initAdaptorEntities(adaptorEntities);
for(int i = 10;i<200;i++){
engine.setThreadNum(i);
engine.enginer();
}
}
}
package com.zjty.adaptationmaster.adaptor.enginer;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;
public class Engine1 {
private static final String path = "C:\\Users\\wyl\\Desktop\\testReplace";
private long totalSize;
private ReadedFileRepository repository = new ReadedFileRepository();
public void readFile(){
//List<>
try {
Files.walkFileTree(Paths.get(path),new SimpleFileVisitor<Path>(){
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
String s = new String(Files.readAllBytes(file));
ReadedFile readedFile = new ReadedFile(s,attrs,file,new ArrayList<>());
if(repository.put(readedFile)){
// ApacheTask apacheTask = new ApacheTask();
// apacheTask.setFile(repository.getReadedFiles());
}
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
//先把文件读取到内存中
private class ReadedFileRepository{
private static final long LIMIT = 200*1024*1024;//字节*k*m
private List<ReadedFile> readedFiles;
private long count;
public List<ReadedFile> getReadedFiles() {
return readedFiles;
}
public boolean put(ReadedFile readedFile){
if(readedFile==null)readedFiles = new ArrayList<>();
readedFiles.add(readedFile);
count+=readedFile.getAttributes().size();
if(count>LIMIT){
return true;
}
return false;
}
}
}
package com.zjty.adaptationmaster.adaptor.enginer;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class KMP {
/**
* 求出一个字符数组的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) {
String path = "C:\\Users\\wyl\\Desktop\\testReplace\\testReplace1\\java\\soapui.properties";
try {
System.out.println(kmpMatch(new String(Files.readAllBytes(Paths.get(path))), "2019-11-27 13:55:36,631 INFO [WorkspaceImpl] Saved workspace to [C:\\Users\\wyl\\intellij-soapui-workspace.xml]\n" +
"2019-11-27 13:55:36,648 INFO [DefaultSoapUICore] Settings saved to [C:\\Users\\wyl\\soapui-setting中华s.xml]"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
\ No newline at end of file
package com.zjty.adaptationmaster.adaptor.enginer;
public enum MatchType {
ALL,PATTERN
}
package com.zjty.adaptationmaster.adaptor.enginer;
import com.zjty.adaptationmaster.adaptor.entity.Rule;
import java.io.*;
import java.util.List;
public class ReadedFileTask implements Runnable {
private List<ReadedFile> readedFiles;
private Writer responseWriter;
public ReadedFileTask(List<ReadedFile> readedFiles,Writer responseWriter){
this.readedFiles = readedFiles;
this.responseWriter = responseWriter;
}
private Adaptor.WriterBySort bySort;
private int index;
public void setBySort(Adaptor.WriterBySort bySort) {
this.bySort = bySort;
}
public void setIndex(int index) {
this.index = index;
}
@Override
public void run() {
for(ReadedFile readedFile:readedFiles){
String content = readedFile.getContent();
System.out.println("规则数量"+readedFile.getThisMatchedRule().size());
for(Rule entity:readedFile.getThisMatchedRule()){
System.out.println("文本匹配方式"+entity.getTextMatching());
switch (entity.getTextMatching()){
case AREA:
String[] split = entity.getTarget().split("\\|\\|");
String begin = split[0];
String matching = split[1];
String end = split[2];
System.out.println(begin+"||"+matching+"||"+end);
int i = content.indexOf(matching);
if(i>-1){
int beginIndex = content.lastIndexOf(begin, i);
int endIndex = content.indexOf(end, i + 1);
if(beginIndex>-1&&endIndex>-1){
content = content.substring(0,beginIndex)+entity.getReplacing()+content.substring(endIndex+end.length());
}
}
}
//container.add(readedFile.getPath().getFileName()+"文本替换:"+entity.getTextMatching()+"|"+entity.getReplacing());
try {
responseWriter.write("===="+readedFile.getPath().getFileName()+"////"+entity.getTextMatching()+"||||"+entity.getReplacing());
} catch (IOException e) {
e.printStackTrace();
}
}
try {
if(bySort!=null){
System.out.println("toBySort");
bySort.insert(index,content);
}else {
System.out.println("writerFile");
File file = readedFile.getPath().toFile();
file.createNewFile();
OutputStreamWriter contentWriter = new OutputStreamWriter(new FileOutputStream(file));
contentWriter.write(content);
contentWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.zjty.adaptationmaster.adaptor.enginer;
import java.util.List;
public class StringFactory implements Runnable {
private List<String> product;
public StringFactory setProduct(List<String> product) {
this.product = product;
return this;
}
@Override
public void run() {
//System.out.println("我开始处理了+++"+Thread.currentThread().getName()+System.currentTimeMillis());
for(String s:product){
if(s.contains("一二三四五")){
System.out.println("包含");
}
int i = 0;
while (true){
i++;
}
// try {
// Object o = new Object();
// synchronized (o) {
// o.wait(20);
// }
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
product.clear();
//System.out.println("我处理完了---"+Thread.currentThread().getName()+"\t"+System.currentTimeMillis());
}
}
package com.zjty.adaptationmaster.adaptor.enginer;
import lombok.AllArgsConstructor;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.util.List;
@AllArgsConstructor
public class StringTask implements Runnable {
private Path path;
private PathMatcher pathMatcher;
@Override
public void run() {
//过滤文件名后缀
if(pathMatcher.matches(path)){
List<String> list = null;
try {
list = Files.readAllLines(path);
for (String s:list){
if(s.contains("一二三四五")){
System.out.println("包含");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.zjty.adaptationmaster.adaptor.enginer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TimeAreaEngine {
public static void main(String[] args) {
TimeAreaEngine engine = new TimeAreaEngine();
engine.setPath("C:\\Users\\wyl\\Desktop\\testReplace");
engine.setProjectName("testReplace");
List<AdaptorEntity> adaptorEntities = new ArrayList<>();
adaptorEntities.add(new AdaptorEntity(null,"log4j",null,"log5j"));
engine.setAdaptorEntities(adaptorEntities);
engine.enginer();
}
private String path;
private List<AdaptorEntity> adaptorEntities;
private static final int THREADCOUNT = 4;
private String projectName;
public void enginer(){
try {
Iterator<File> fileIterator = FileUtils.iterateFiles(new File(path), new String[]{"java", "txt", "properties"}, true);
while (fileIterator.hasNext()){
List<String> stringList = FileUtils.readLines(fileIterator.next(), "utf-8");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.zjty.adaptationmaster.adaptor.enginer.exception;
public class FileTypeNotMatchException extends Exception {
public FileTypeNotMatchException(){
super();
}
public FileTypeNotMatchException(String message){
super(message);
}
public FileTypeNotMatchException(String message,Throwable cause){
super(message,cause);
}
public FileTypeNotMatchException(Throwable cause){
super(cause);
}
}
package com.zjty.adaptationmaster.adaptor.enginer.util;
public class StringCompareUtil1 {
/**
* 长字符串中是否包含arg2
* 原生方法速度慢
* 用kmp重写之
*
*
* @param text
* @param pattern
* @return
*/
public int compare(String text,String pattern){
//return text.indexOf(pattern);
return KMP(text,pattern);
}
//KMP算法实现
private int KMP(String source, String pattern) {
int[] N=getN(pattern);
int res=0;
int sourceLength=source.length();
int patternLength=pattern.length();
for(int i=0;i<=(sourceLength-patternLength);){
res++;
String str=source.substring(i, i+patternLength);//要比较的字符串
int count=getNext(pattern, str,N);
if(count==0){
return i;
}
i=i+count;
}
return -1;
}
/**
* 得到下一次要移动的次数
*
* @param pattern
* @param str
* @param N
* @return 0,字符串匹配;
*/
private int getNext(String pattern,String str,int[] N) {
int n = pattern.length();
char v1[] = str.toCharArray();
char v2[] = pattern.toCharArray();
int x = 0;
while (n-- != 0) {
if (v1[x] != v2[x]){
if(x==0){
return 1;//如果第一个不相同,移动1步
}
return x-N[x-1];//x:第一次出现不同的索引的位置,即j
}
x++;
}
return 0;
}
private int[] getN(String pattern) {
char[] pat=pattern.toCharArray();
int j=pattern.length()-1;
int[] N=new int[j+1];
for(int i=j;i>=2;i--){
N[i-1]=getK(i,pat);
}
return N;
}
/**
*
* @param j 匹配字符长度-1,递减
* @param pat
* @return
*/
private int getK(int j, char[] pat) {
int x=j-2;//匹配字符长度-3
int y=1;
while (x>=0 && compare(pat, 0, x, y, j-1)) {
x--;
y++;
}
return x+1;
}
//逐字匹配,发现不对,返回true
private boolean compare(char[] pat,int b1,int e1,int b2,int e2){
int n = e1-b1+1;
while (n-- != 0) {
if (pat[b1] != pat[b2]){
return true;
}
b1++;
b2++;
}
return false;
}
}
package com.zjty.adaptationmaster.adaptor.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* <h4>Description : adaptation-master</h4>
*
* @author : M@tr!x [xhyrzldf@foxmail.com]
* @Date : 2019-12-19 11:37
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AdaptRequest {
private Project project;
private List<Rule> ruleList;
private String uuid;
private String path;
}
......@@ -27,8 +27,10 @@ public class Assembly {
private String callingMode;//调用方式
private String demo;//demo链接
@Temporal(TemporalType.TIMESTAMP)
private Date startTime;//上传时间
private Date startTime = new Date();//上传时间
private Integer status = 1;//状态(0:删除 1:未删除)
}
package com.zjty.adaptationmaster.adaptor.examination;
package com.zjty.adaptationmaster.adaptor.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Report {
public String type;//语言类型
public String structure;//项目架构
public String sqlType;//数据库类型
@Override
public String toString(){
return ""+type+structure+sqlType;
}
@NoArgsConstructor
@Data
public class FileReturn {
private String name;//上传文件名称
private String path;//上传文件地址
}
......@@ -28,6 +28,8 @@ public class MiddlewareManagement {
private String ip;//中间件ip
private String type;//类型
private String port;//端口号
@Temporal(TemporalType.TIMESTAMP)
......
package com.zjty.adaptationmaster.adaptor.entity;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -20,22 +19,27 @@ import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Entity
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(unique = true)
private String projectName;//项目名称
private String language;//语言
private String sourceDB;//原数据库
private String createTypeDB;//目标数据库
private String createMiddleware;//目标中间件
private String operatingSystem;//操作系统
private String cpu;//cpu
private String projectEntry;//项目入口
private String framework;//架构
private String isSeparate;//前后端是否分离
private String codeUrl;//当前源码源码路径
private String databaseType;//数据库类型
private String des;//描述
private String codeUrl;//当前源码源码路径
private Integer stage;//阶段(0:源代码 1:替换后 2:编译后)
private Integer status = 1;//状态(0:删除 1:未删除)
......@@ -53,4 +57,13 @@ public class Project {
joinColumns = @JoinColumn(name = "p_id",referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "r_id", referencedColumnName = "id"))
private List<RuleSet> ruleSets;//规则集
private boolean compileSuccess = false;
@OneToOne
private ReportEntity report;
private boolean deploySuccess = false;
private String deployPath = "编译路径";//不知道路径,等王永磊改
}
package com.zjty.adaptationmaster.adaptor.entity;
import com.zjty.adaptationmaster.adaptor.entity.pomEntity.ProjectPom;
import com.zjty.adaptationmaster.adaptor.entity.pomEntity.SecondFloor.PomDependency;
import com.zjty.adaptationmaster.utils.Inspector;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.util.List;
import java.util.Map;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Report {
private Integer id;
private Language language;//语言
private String framework;//架构
private DatabaseType databaseType;//数据库类型
private int fileNum;
private long lineNum;
//取名,后端依赖
private List<PomDependency> dependencies;
//取名。前端依赖
private List<PomDependency> dependencies1;
@Transient
private ProjectPom projectPom;
@Transient
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 long createTime;
public enum DependenceManagement{
MAVEN,GRADLE,ANT
}
public enum Separate{
WHOLE,SEPARATE
}
public enum DatabaseType{
MYSQL,ORACLE,SQLSERVER,POSTGRE
}
public enum Language{
JAVA,PYTHON,CPP,JSP,ASP,ONLYVIEW,UNKNOW,JAVASCRIPT,GO
}
}
package com.zjty.adaptationmaster.adaptor.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
/**
* 返回
* @author Mcj
* @date 2020-01-03 10:33
*/
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ReportEntity {
@Id
@GeneratedValue
private Integer id;
private Report.Language language;//语言
private String framework;//架构
private Report.DatabaseType databaseType;//数据库类型
private int fileNum;
private long lineNum;
private Report.Separate isSeparate;//前后端是否分离
private String compileFilePath;//项目编译文件,如果是maven项目,用maven编译,那么就是pom.xml
public Report.DependenceManagement dependenceManagement;//版本管理方式
private String packagePath;
public String jarPath;//依赖文件的地址列表,用于编译,如果不是用版本管理工具
@Column(columnDefinition = "text")
private String warnList;
private long createTime;
public enum DependenceManagement{
MAVEN,GRADLE,ANT
}
public enum Separate{
WHOLE,SEPARATE
}
public enum DatabaseType{
MYSQL,ORACLE,SQLSERVER,POSTGRE
}
public enum Language{
JAVA,PYTHON,CPP,JSP,ASP,ONLYVIEW
}
}
......@@ -30,9 +30,11 @@ public class Rule {
private Integer status = 1;//状态(0:删除 1:未删除)
private MatchType pathMatchType;//文件匹配方式 路径/文件名/后缀
//private MatchType pathMatchType;//文件匹配方式 路径/文件名/后缀
private String path;//文件路径匹配
private TextMatch textMatching;//文本匹配方式 全文匹配/正则匹配
private String des;
//private TextMatch textMatching;//文本匹配方式 全文匹配/正则匹配
//private DealWay dealWay;//替换,在匹配字之前插入,在匹配字之后插入
/**
* AREA
......@@ -41,15 +43,19 @@ public class Rule {
private String target;//文本匹配目标
private String replacing;//更改方式 全文替换/正则替换
public static enum MatchType{
PATH,NAME,SUFFIX
}
public static enum TextMatch{
AREA
}
public static enum DealWay{
REPLACE,INSERTAFTER,INSERTBEFORE
public Rule(String target,String replacing){
this.target = target;
this.replacing = replacing;
}
// public enum MatchType{
// PATH,NAME,SUFFIX,GLOB
// }
//
// public enum TextMatch{
// AREA,CONTENT
// }
//
// public enum DealWay{
// REPLACE,INSERTAFTER,INSERTBEFORE,InsertBetween
// }
}
......@@ -36,4 +36,13 @@ public class RuleSet {
@OneToMany(mappedBy = "ruleSet", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Rule> ruleList;//规则
/**
* 项目中的规则集的列表视图
*/
public void ruleSetView(){
projects = null;
ruleList = null;
}
}
package com.zjty.adaptationmaster.adaptor.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import net.bytebuddy.asm.Advice;
import java.util.List;
/**
* <h4>Description : adaptation-master</h4>
*
* @author : M@tr!x [xhyrzldf@foxmail.com]
* @Date : 2019-12-18 13:48
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RuleSetAndRule {
private List<RuleSet> ruleSets;
private List<Rule> rules;
}
package com.zjty.adaptationmaster.adaptor.entity;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.zjty.adaptationmaster.adaptor.VueBrowserslist;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.HashMap;
import java.util.List;
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.adaptationmaster.adaptor.entity.db;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class DBDeleteResponse {
private String dbName;//数据库名称
private String dbType;//数据库类型
private Integer id;
}
package com.zjty.adaptationmaster.adaptor.entity.db;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class DBManage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String configName;//配置名称
private String userName;//用户名
private String password;//密码
private String databaseType;//数据库类型
private String address;//连接地址
private String port;//数据库端口号
@Transient
private String databaseName;//可连接数据库名字
@Transient
private String connectionType;//数据库连接时的sql
@Transient
private String driver;//数据库驱动
private Integer status;//逻辑删除 0-删除 1-未删除
}
package com.zjty.adaptationmaster.adaptor.entity.db;
public class DBName {
public static String highgoName = "highgo";
}
package com.zjty.adaptationmaster.adaptor.entity.db;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class DBNameReturn {
List<String> dbName;
Integer status;//连接状态1-开启 0-关闭
}
package com.zjty.adaptationmaster.adaptor.entity.db;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Date;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class DBRecord {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;//主键id,自增
private String dbName;//数据库名字
private String sourceType;//原库类型
private String createType;//生成库类型
private String userName;//用户名
private String sqlPath;//上传sql本地地址
private String createSqlPath;//转换后的sql本地地址
private Date createTime;//创建时间
private Integer status;//逻辑删除 0-删除 1-未删除
}
package com.zjty.adaptationmaster.adaptor.entity.db;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class DBRecordPage {
private String createType;//生成库类型
private String userName;//用户名
private Integer page;//当前页
private Integer size;//每页数量
}
package com.zjty.adaptationmaster.adaptor.entity.db;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class DBRecordReturn {
private long count;//总数
private List<DBRecord> dbRecords;
}
package com.zjty.adaptationmaster.adaptor.entity.db;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class DatabaseResponse {
private String databaseName;//数据库名称
private String sourceType;//原库类型
private String createType;//生成库类型
private String sqlPath;//上传数据库地址
private Integer id;//用户ID
private String uuid;//uuid
}
package com.zjty.adaptationmaster.adaptor.entity.db;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.HashMap;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class RegularReturn {
private String path;//路径
private HashMap<String, List<String>> nameHashMap;
}
package com.zjty.adaptationmaster.adaptor.entity.db;
import com.zjty.adaptationmaster.utils.Regular;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class SQLExecuteTask implements Runnable{
private DBManage dbManage;
private String sql;
public SQLExecuteTask(DBManage dbManage){
this.dbManage = dbManage;
}
public void setSql(String sql){
this.sql = sql;
}
@Override
public void run() {
Connection connection = null;
PreparedStatement preparedStatement = null;
String unRecordSql = "SET LOCAL synchronous_commit TO OFF;";
try {
connection = Regular.databaseConnection(dbManage);
//将数据库临时设置为异步提交,不等待wal日志完成就返回成功响应
preparedStatement = connection.prepareStatement(unRecordSql);
preparedStatement.execute();
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setQueryTimeout(10);
preparedStatement.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
preparedStatement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
package com.zjty.adaptationmaster.adaptor.entity.pomEntity;
import com.zjty.adaptationmaster.adaptor.entity.pomEntity.SecondFloor.PomDependency;
import com.zjty.adaptationmaster.adaptor.entity.pomEntity.SecondFloor.Parent;
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.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 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.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.entity.pomEntity.SecondFloor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.util.List;
@Entity
@NoArgsConstructor
@Data
public class PomDependency {
@Id
@GeneratedValue
private int id;
private String groupId;
private String artifactId;
private String version;
private Integer reportId;
/**
* 1:前端依赖
* 2:后端依赖
*/
// TODO: 2020-01-15 取名
private Integer q;
/*依赖类型,默认类型是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.adaptationmaster.adaptor.examination;
import com.zjty.adaptationmaster.adaptor.enginer.Counter;
import com.zjty.adaptationmaster.adaptor.enginer.util.StringCompareUtil;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 项目体检,根据既定特征值,
* 扫描、统计、分析项目特征,
* 生成报告
*
*/
public class Inspectors {
private String path;
private Map<String, Counter> matchMap;
private List<Path> propertiesConfigPaths = new ArrayList<>();
private List<Path> ymlConfigPaths = new ArrayList<>();
private List<Path> xmlConfigPaths = new ArrayList<>();
private Report report = new Report();
public void setPath(String path) {
this.path = path;
}
public void setMatchMap(Map<String, Counter> matchMap) {
this.matchMap = matchMap;
}
public static void main(String[] args) {
Inspectors inspectors = new Inspectors();
inspectors.setPath("C:\\Users\\wyl\\Desktop\\testReplace");
Map<String,Counter> map = new HashMap<>();
map.put("java",new Counter());
map.put("jsp",new Counter());
map.put("html",new Counter());
inspectors.setMatchMap(map);
inspectors.inspect();
//打印分析数据
for(Map.Entry<String,Counter> entry:map.entrySet()) {
System.out.println("项目中"+entry.getKey()+"类型文件共有" + entry.getValue().getI()+"个");
}
//打印体检报告
System.out.println(inspectors.analysis());
}
/**
* FileVisitResult.CONTINUE 继续遍历
* FileVisitResult.TERMINATE 中止访问
* FileVisitResult.SKIP_SIBLINGS 不访问同级的文件或目录
* FileVisitResult.SKIP_SUBTREE 不访问子目录
*/
public void inspect(){
try {
String glob = "glob:**/*.txt";
final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher( glob);
Files.walkFileTree(Paths.get(path), new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
//判断后缀
for (Map.Entry<String, Counter> s : matchMap.entrySet()) {
if (dir.endsWith(s.getKey())) {
s.getValue().plus();
}
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
boolean matches = pathMatcher.matches(file);
if (file.endsWith("properties")) {
propertiesConfigPaths.add(file);
}
if(file.endsWith("yml")){
ymlConfigPaths.add(file);
}
if(file.endsWith("xml")){
xmlConfigPaths.add(file);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
public Report analysis(){
if(matchMap.get("java").getI()>0){
report.setType("java");
}
if(matchMap.get("jsp").getI()>0){
report.setStructure("whole");
}
if(matchMap.get("html").getI()>0){
report.setStructure("separation");
}
for(Path path:propertiesConfigPaths){
try {
for(String s:Files.readAllLines(path)){
int index = StringCompareUtil.compare(s, "spring.datasource.driver-class-name");
if(index >- 1){
if(!s.startsWith("#")){
/**
* MySQL数据库:
*
*     1)驱动包:https://mvnrepository.com/artifact/mysql/mysql-connector-java(下载路径)
*
*     2)驱动类名:com.mysql.jdbc.Driver
*
*     3)JDBC的URL:jdbc:mysql://IP地址:端口号/数据库名字
*
*      注:端口号缺省为:3306
*
* SQL server数据库:
*
*     1)驱动包:https://mvnrepository.com/artifact/com.microsoft.sqlserver/sqljdbc4(下载路径)
*
*     2)驱动类名:com.microsoft.jdbc.sqlserver.SQLServerDriver
*
*     3)JDBC的URL:jdbc:microsoft:sqlserver://IP地址:端口号;DatabaseName=数据库名
*
*     4)sqljdbc和sqljdbc4区别:https://blog.csdn.net/cainiao_M/article/details/53404222
*
*     注:端口号缺省为:1433
*
* Oracle数据库:
*
*     1)驱动包:https://mvnrepository.com/artifact/com.oracle/ojdbc6(下载路径)
*
*     2)驱动类名:oracle.jdbc.driver.OracleDriver
*
*     3)JDBC的URL:jdbc:oracle:thin:@IP地址:端口号:数据库名
*
*     4)ojdbc6和ojdbc14的区别:ojdbc14.jar(适合java-1.4和1.5),ojdbc6(适合java-1.6)
*
*     注:端口号缺省为:1521
*/
if(StringCompareUtil.compare(s, "mysql")>-1){
report.setSqlType("mysql");
}else if(StringCompareUtil.compare(s, "sqlserver")>-1){
report.setSqlType("SQLServer");
}else if(StringCompareUtil.compare(s, "oracle")>-1){
report.setSqlType("oracle");
}else if(StringCompareUtil.compare(s, "postgre")>-1){
report.setSqlType("postgre");
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
package com.zjty.adaptationmaster.managerment.dao;
package com.zjty.adaptationmaster.adaptor.repository;
import com.zjty.adaptationmaster.adaptor.entity.AdaptationDetailsLogEntity;
import org.springframework.data.jpa.repository.JpaRepository;
......
package com.zjty.adaptationmaster.adaptor.repository;
import com.zjty.adaptationmaster.adaptor.entity.db.DBManage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface DBManageDao extends JpaRepository<DBManage,Integer> {
DBManage findDBManageByIdAndStatus(Integer id,Integer status);
List<DBManage> findDatabaseManagementByStatus(Integer status);
@Query("update DBManage d set d.status =:status where d.id =:id")
@Modifying
void delete(@Param(value = "id") Integer id, @Param(value = "status") Integer status);
}
package com.zjty.adaptationmaster.adaptor.repository;
import com.zjty.adaptationmaster.adaptor.entity.db.DBRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface DBRecordDao extends JpaRepository<DBRecord,Integer>, JpaSpecificationExecutor {
@Modifying
@Query("update DBRecord d set d.status =:status where d.dbName =:dbName")
void delete(@Param(value = "dbName") String dbName, @Param(value = "status") Integer status);
List<DBRecord> findDBRecordsByStatus(Integer status);
}
package com.zjty.adaptationmaster.adaptor.repository;
import com.zjty.adaptationmaster.adaptor.entity.Dependency;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
......
package com.zjty.adaptationmaster.managerment.dao;
package com.zjty.adaptationmaster.adaptor.repository;
import com.zjty.adaptationmaster.adaptor.entity.OriginalFile;
import org.springframework.data.jpa.repository.JpaRepository;
......
package com.zjty.adaptationmaster.adaptor.repository;
import com.zjty.adaptationmaster.adaptor.entity.pomEntity.SecondFloor.PomDependency;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface PomDependencyDao extends JpaRepository<PomDependency,Integer> {
List<PomDependency> findAllByReportIdEquals(Integer id);
}
......@@ -11,4 +11,5 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
* @Date : 2019-12-07 10:55
*/
public interface ProjectDao extends JpaRepository<Project, Integer>,JpaSpecificationExecutor {
Project findByProjectName(String projectName);
}
package com.zjty.adaptationmaster.adaptor.repository;
import com.zjty.adaptationmaster.adaptor.entity.Report;
import com.zjty.adaptationmaster.adaptor.entity.ReportEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface ReportDao extends JpaRepository<ReportEntity, Integer>, JpaSpecificationExecutor {
}
package com.zjty.adaptationmaster.adaptor.repository;
import com.zjty.adaptationmaster.adaptor.entity.Rule;
import org.springframework.data.domain.Example;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
* <h4>Description : adaptation-master</h4>
......@@ -11,4 +15,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
* @Date : 2019-12-09 9:30
*/
public interface RuleDao extends JpaRepository<Rule, Integer>,JpaSpecificationExecutor {
@Query("select r from Rule r where r.ruleSet = null and r.status = 1")
List<Rule> findRulesInProject();
}
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;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public interface AdaptationService {
ServerResponse adapt(Project response, List<Rule> ruleList,String uuid) throws IOException;
ServerResponse compile(Project project, String uuid);
ServerResponse deploy(Project project, String uuid);
ServerResponse unZipProject(String path,Project project);
ServerResponse start(Project project, String uuid);
ServerResponse stop(Project project, String uuid);
ServerResponse uploadDeploy(Project project, String path);
}
package com.zjty.adaptationmaster.adaptor.service;
import com.zjty.adaptationmaster.adaptor.entity.db.DBDeleteResponse;
import com.zjty.adaptationmaster.adaptor.entity.db.DBManage;
import com.zjty.adaptationmaster.base.response.ServerResponse;
public interface DBManageService {
ServerResponse saveDatabase(DBManage databaseManagement);
ServerResponse deleteDatabase(Integer id);
ServerResponse findDatabase();
ServerResponse deleteDB(DBDeleteResponse dbDeleteResponse);
}
package com.zjty.adaptationmaster.adaptor.service;
import com.zjty.adaptationmaster.adaptor.entity.db.DatabaseResponse;
import com.zjty.adaptationmaster.base.response.ServerResponse;
public interface DBMigrateService {
ServerResponse dbMigrate(DatabaseResponse databaseResponse);
ServerResponse findDBByDBType(Integer id);
}
package com.zjty.adaptationmaster.adaptor.service;
import com.zjty.adaptationmaster.adaptor.entity.db.DBDeleteResponse;
import com.zjty.adaptationmaster.adaptor.entity.db.DBRecordPage;
import com.zjty.adaptationmaster.base.response.ServerResponse;
public interface DBRecordService {
ServerResponse pageFind(DBRecordPage dbRecordPage);
}
......@@ -2,6 +2,7 @@ package com.zjty.adaptationmaster.adaptor.service;
import com.zjty.adaptationmaster.adaptor.entity.Dependency;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
/**
......@@ -12,7 +13,7 @@ import org.springframework.web.multipart.MultipartHttpServletRequest;
*/
public interface DependencyService {
ServerResponse saveDependency(Dependency dependency , MultipartHttpServletRequest request);//保存依赖
ServerResponse saveDependency(Dependency dependency , MultipartFile file);//保存依赖
ServerResponse deleteDependency(Integer id);//删除依赖
......
package com.zjty.adaptationmaster.adaptor.service;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import javax.servlet.http.HttpServletRequest;
public interface FileUploadService {
ServerResponse fileUpload(HttpServletRequest request);
}
package com.zjty.adaptationmaster.adaptor.service.Impl;
import com.zjty.adaptationmaster.adaptor.entity.Project;
import com.zjty.adaptationmaster.adaptor.entity.Rule;
import com.zjty.adaptationmaster.adaptor.entity.RuleSet;
import com.zjty.adaptationmaster.adaptor.repository.ProjectDao;
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;
import static java.util.stream.Collectors.toList;
@Service
public class AdaptationServiceImpl implements AdaptationService {
Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private Adaptor adaptor;
@Autowired
private ProjectDao projectDao;
@Override
@Transactional
public ServerResponse adapt(Project project,List<Rule> rules,String uuid) throws IOException {
adaptor.setRuleList(rules);
adaptor.setProject(project);
adaptor.setUuid(uuid);
return adaptor.doAdapt();
}
@Override
@Transactional
public ServerResponse compile(Project project, String uuid) {
// Project project = new Project();
// project.setCompileFilePath("C:\\home\\project\\rsc\\hrmbclient\\pom.xml");
// project.setDependenceManagement(Report.DependenceManagement.MAVEN);
//Project project = projectDao.getOne(projectId);
try {
if(project.getReport()==null) {
return ServerResponse.error("请进行项目体检或完善项目信息");
}
switch (project.getReport().getDependenceManagement()) {
case MAVEN:
new MavenCompiler(project, Const.MAVENHOME, uuid).compiler();
break;
default:
}
Project one = projectDao.getOne(project.getId());
one.setStage(2);
return ServerResponse.success("编译成功",filter(one));
}catch (Exception e){
return ServerResponse.error("编译失败");
}
}
@Override
public ServerResponse deploy(Project project, String uuid) {
// Project project = new Project();
// project.setPackagePath("/home/user/Desktop/hrmanager-0.0.1-SNAPSHOT.war");
//Project project = projectDao.getOne(projectId);
new ApusicDeployer(Const.CTLPATH,Const.MAVENHOME).deploy(project,uuid);
return ServerResponse.success(project);
}
@Transactional
@Override
public ServerResponse unZipProject(String path, Project project) {
Project project1 = projectDao.getOne(project.getId());
//FileUtil fileUtil = new FileUtil();
//project1.setCodeUrl(Const.UPLOAD_LOCATION+File.separator+project1.getProjectName());
project1.setCodeUrl(Const.UPLOAD_LOCATION+project1.getProjectName());
try {
FileUtils.cleanDirectory(new File(project1.getCodeUrl()));
FileZip.unzip(new File(path),project1.getCodeUrl());
project1.setStage(project.getStage());
if(project.getStage() == 1){
project1.setReport(null);
}
} catch (Exception e) {
e.printStackTrace();
}
return ServerResponse.success(project1);
}
@Override
public ServerResponse start(Project project, String uuid) {
return ServerResponse.success(new ApusicDeployer(Const.CTLPATH,Const.MAVENHOME).start(project.getProjectName(),uuid));
}
@Override
public ServerResponse stop(Project project, String uuid) {
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();
if(ruleSets != null && ruleSets.size() > 0){
List<RuleSet> sets = new ArrayList<>();
for (RuleSet set :ruleSets) {
set.ruleSetView();
if(set.getStatus() == 1){
sets.add(set);
}
}
pro.setRuleSets(sets);
}
//过滤删除的自定义规则
List<Rule> rules = pro.getRules();
if(rules != null && rules.size() > 0){
List<Rule> collect = rules.stream().filter(rule -> rule != null && rule.getStatus() != 0).collect(toList());
pro.setRules(collect);
}
return pro;
}
public static void main(String[] args) {
System.out.println(File.separator);
}
}
......@@ -41,11 +41,11 @@ public class AssemblyServiceImpl implements AssemblyService{
@Override
public ServerResponse saveAssembly(Assembly assembly) {
Assembly save = assemblyDao.save(assembly);
return ServerResponse.success(JSON.toJSONString(save));
return ServerResponse.success(save);
}
@Override
@Transactional
@Transactional(rollbackFor = Exception.class)
public ServerResponse deleteAssembly(Integer id) {
Assembly assembly = assemblyDao.getOne(id);
assembly.setStatus(0);
......@@ -58,8 +58,9 @@ public class AssemblyServiceImpl implements AssemblyService{
.like(assembly.getName()!=null,"name","%"+assembly.getName()+"%")
.eq("status",1)
.build();
Pageable pageable = /*new */PageRequest.of(page-1, 10, Sort.Direction.DESC, "id");
List<Assembly> assemblyList = assemblyDao.findAll(spec,pageable).getContent();
return ServerResponse.success(new ListResponse<>(assemblyDao.count(spec),assemblyList));
// Pageable pageable = /*new */PageRequest.of(page-1, 10, Sort.Direction.DESC, "id");
List<Assembly> assemblyList = assemblyDao.findAll(spec);
// return ServerResponse.success(new ListResponse<>(assemblyDao.count(spec),assemblyList));
return ServerResponse.success(assemblyList);
}
}
package com.zjty.adaptationmaster.adaptor.service.Impl;
import com.zjty.adaptationmaster.adaptor.entity.db.DBDeleteResponse;
import com.zjty.adaptationmaster.adaptor.entity.db.DBManage;
import com.zjty.adaptationmaster.adaptor.entity.db.DBName;
import com.zjty.adaptationmaster.adaptor.entity.db.DBRecord;
import com.zjty.adaptationmaster.adaptor.repository.DBManageDao;
import com.zjty.adaptationmaster.adaptor.repository.DBRecordDao;
import com.zjty.adaptationmaster.adaptor.service.DBManageService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import com.zjty.adaptationmaster.utils.Regular;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@Service
public class DBManageServiceImpl implements DBManageService {
@Autowired
private DBManageDao databaseDao;
@Autowired
private DBRecordDao dbRecordDao;
@Value("${highgo.driver}")
private String highgoDriver;
@Value("${highgo.connectionType}")
private String highgoConnnectionType;
@Value("${highgo.dbName}")
private String highgoDBName;
/**
* 新增数据库配置文件
* @param databaseManagement
* @return
*/
@Override
@Transactional
public ServerResponse saveDatabase(DBManage databaseManagement) {
databaseManagement.setStatus(1);//1-未删除
return ServerResponse.success(databaseDao.save(databaseManagement));
}
/**
* 根据id删除数据库配置文件
* @param id
* @return
*/
@Override
@Transactional
public ServerResponse deleteDatabase(Integer id) {
databaseDao.delete(id,0);//逻辑删除
return ServerResponse.success(id);
}
/**
* 查找未被逻辑删除的数据库配置文件
* @return
*/
@Override
public ServerResponse findDatabase() {
return ServerResponse.success(databaseDao.findDatabaseManagementByStatus(1));
}
/**
* 数据库删除
* @param dbDeleteResponse
* @return
*/
@Override
@Transactional
public ServerResponse deleteDB(DBDeleteResponse dbDeleteResponse) {
DBManage dbManage = databaseDao.findDBManageByIdAndStatus(dbDeleteResponse.getId(),1);
if(dbDeleteResponse.getDbType().equals(DBName.highgoName)){
dbManage.setDatabaseName(highgoDBName);
dbManage.setDriver(highgoDriver);
dbManage.setConnectionType(highgoConnnectionType);
}
Connection connection = Regular.databaseConnection(dbManage);
if (connection != null) {
PreparedStatement preparedStatement = null;
try {
String findDB = "DROP DATABASE IF EXISTS " + dbDeleteResponse.getDbName()+ ";";
preparedStatement = connection.prepareStatement(findDB);
preparedStatement.execute();
dbRecordDao.delete(dbDeleteResponse.getDbName(),0);
} catch (SQLException e) {
e.printStackTrace();
return ServerResponse.error(e.getMessage());
} finally {
try {
preparedStatement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return ServerResponse.success();
}
}
package com.zjty.adaptationmaster.adaptor.service.Impl;
import com.github.wenhao.jpa.Specifications;
import com.zjty.adaptationmaster.adaptor.entity.db.*;
import com.zjty.adaptationmaster.adaptor.repository.DBManageDao;
import com.zjty.adaptationmaster.adaptor.repository.DBRecordDao;
import com.zjty.adaptationmaster.adaptor.service.DBRecordService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import com.zjty.adaptationmaster.utils.Regular;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@Service
public class DBRecordServiceImpl implements DBRecordService {
@Autowired
private DBRecordDao dbRecordDao;
@Autowired
private DBManageDao dbManageDao;
/**
* 分页条件查询
* @param dbRecordPage
* @return
*/
@Override
public ServerResponse pageFind(DBRecordPage dbRecordPage) {
Specification<DBRecord> specifications = Specifications.<DBRecord>and()
.eq(dbRecordPage.getCreateType() != null,"createType",dbRecordPage.getCreateType())
//.eq(dbRecordPage.getUserName() != null,"userName",dbRecordPage.getUserName())
.eq("status",1)
.build();
/*Integer page = dbRecordPage.getPage();
Integer size = dbRecordPage.getSize();
if(page == null || page <= 0){
page = 1;
}
if(size == null || size <= 0){
size = 10;
}
Pageable pageable = PageRequest.of(page - 1,size, Sort.Direction.DESC,"createTime");
long count = dbRecordDao.count(specifications);
if(count < 0){
return ServerResponse.error();
}*/
return ServerResponse.success(dbRecordDao.findAll(specifications));
}
}
......@@ -37,18 +37,17 @@ public class DependencyServiceImpl implements DependencyService {
}
@Override
public ServerResponse saveDependency(Dependency dependency, MultipartHttpServletRequest request) {
public ServerResponse saveDependency(Dependency dependency, MultipartFile dependencyFile) {
//上传的依赖文件和依赖包
MultipartFile dependencyFile = request.getFile("dependency");
if (!dependencyFile.isEmpty()) {
//依赖名称
String photo = dependencyFile.getName();
dependency.setName(photo);
dependency.setDependencyUrl("/uploads/"+photo);
String originalFilename = dependencyFile.getOriginalFilename();
assert originalFilename != null;
dependency.setDependencyUrl("/uploads/"+originalFilename);
dependency.setStartTime(new Date());
try {
InputStream inputStream = dependencyFile.getInputStream();
Files.copy(inputStream, Paths.get(Const.UPLOAD_LOCATION, photo));
Files.copy(inputStream, Paths.get(Const.UPLOAD_LOCATION, originalFilename));
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
......@@ -69,6 +68,7 @@ public class DependencyServiceImpl implements DependencyService {
@Override
public ServerResponse findDependency(Dependency dependency) {
Specification<Dependency> spec = Specifications.<Dependency>and()
.like(dependency.getName()!=null,"name","%"+dependency.getName()+"%")
.eq(dependency.getType()!=null,"type",dependency.getType())
.eq("status",1)
.build();
......
package com.zjty.adaptationmaster.adaptor.service.Impl;
import com.zjty.adaptationmaster.adaptor.entity.FileReturn;
import com.zjty.adaptationmaster.adaptor.service.FileUploadService;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Service
public class FileUploadServiceImpl implements FileUploadService {
/**
* 前台文件上传
* @param request
* @return
*/
@Override
public ServerResponse fileUpload(HttpServletRequest request) {
List<MultipartFile> multipartFiles = ((MultipartHttpServletRequest)request).getFiles("file");
List<FileReturn> fileReturns = new ArrayList<>();
for(MultipartFile multipartFile:multipartFiles){
InputStream is = null;
BufferedInputStream bis = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
FileReturn fileReturn = new FileReturn();
String sourceName = multipartFile.getOriginalFilename();
String suffix = sourceName.substring(sourceName.lastIndexOf("."));
String fileName = UUID.randomUUID().toString() + suffix;
//不存在该目录,创建目录
File file = new File("/sqlFile/uploads");
if(!file.exists()){
file.mkdirs();
}
String savePath = file.getAbsolutePath() + "/" + fileName;
fileReturn.setName(sourceName);
fileReturn.setPath(savePath);
fileReturns.add(fileReturn);
File createFile = new File(savePath);
try {
is = multipartFile.getInputStream();
bis = new BufferedInputStream(is);
fos = new FileOutputStream(createFile);
bos = new BufferedOutputStream(fos);
int len = -1;
byte[] b = new byte[1024];
while ((len = bis.read(b)) != -1){
bos.write(b,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bis.close();
is.close();
bos.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return ServerResponse.success(fileReturns);
}
}
......@@ -7,7 +7,10 @@ import com.zjty.adaptationmaster.adaptor.entity.Rule;
import com.zjty.adaptationmaster.adaptor.entity.RuleSet;
import com.zjty.adaptationmaster.adaptor.repository.ProjectDao;
import com.zjty.adaptationmaster.adaptor.service.ProjectService;
import com.zjty.adaptationmaster.base.enums.Const;
import com.zjty.adaptationmaster.base.response.ServerResponse;
import com.zjty.adaptationmaster.utils.ApusicDeployer;
import com.zjty.adaptationmaster.utils.ZipUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
......@@ -16,6 +19,10 @@ import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
......@@ -42,8 +49,12 @@ public class ProjectServiceImpl implements ProjectService {
if(project.getId() == null){
project.setUpdateTime(new Date());
}
List<Rule> rules = project.getRules();
if(rules != null) {
rules.forEach(rule -> rule.setProject(project));
}
Project save = projectDao.save(project);
return ServerResponse.success("项目创建成功",save);
return ServerResponse.success("项目创建成功",filter(save));
}
@Override
......@@ -64,19 +75,53 @@ public class ProjectServiceImpl implements ProjectService {
Pageable pageable = PageRequest.of(page-1, 10, Sort.Direction.DESC, "id");
List<Project> projects = projectDao.findAll(spec,pageable).getContent();
for (Project pro:projects) {
//过滤删除的规则集
List<RuleSet> ruleSets = pro.getRuleSets();
List<RuleSet> sets = ruleSets.stream().filter(ruleSet -> ruleSet.getStatus() != 0).collect(toList());
for (RuleSet set :sets) {
List<Rule> rs = set.getRuleList().stream().filter(rule -> rule.getStatus() != 0).collect(toList());
set.setRuleList(rs);
filter(pro);
}
return ServerResponse.success(new ListResponse<>(projectDao.count(spec),projects));
}
/**
* 过滤被删除的规则和规则集
* @param pro
* @return
*/
private Project filter(Project pro){
//过滤删除的规则集
List<RuleSet> ruleSets = pro.getRuleSets();
if(ruleSets != null && ruleSets.size() > 0){
List<RuleSet> sets = new ArrayList<>();
for (RuleSet set :ruleSets) {
set.ruleSetView();
if(set.getStatus() == 1){
sets.add(set);
}
}
pro.setRuleSets(sets);
//过滤删除的自定义规则
List<Rule> rules = pro.getRules();
List<Rule> collect = rules.stream().filter(rule -> rule.getStatus() != 0).collect(toList());
}
//过滤删除的自定义规则
List<Rule> rules = pro.getRules();
if(rules != null && rules.size() > 0){
List<Rule> collect = rules.stream().filter(rule -> rule != null && rule.getStatus() != 0).collect(toList());
pro.setRules(collect);
}
return ServerResponse.success(new ListResponse<>(projectDao.count(spec),projects));
return pro;
}
@Override
public ServerResponse deployList() {
return ServerResponse.success(new ApusicDeployer(Const.CTLPATH,Const.MAVENHOME).list());
}
@Override
public ServerResponse downLoad(Project project) {
try {
String projectName = project.getProjectName();
FileOutputStream zip= new FileOutputStream(new File(project.getCodeUrl()+"/"+projectName+".zip"));
ZipUtils.toZip(project.getCodeUrl(),zip,true);
return ServerResponse.success("下载成功","/uploads/"+projectName+"/"+projectName+".zip");
} catch (FileNotFoundException e) {
e.printStackTrace();
return ServerResponse.error("下载失败");
}
}
}
......@@ -4,6 +4,7 @@ import com.github.wenhao.jpa.Specifications;
import com.zjty.adaptationmaster.adaptor.entity.Project;
import com.zjty.adaptationmaster.adaptor.entity.Rule;
import com.zjty.adaptationmaster.adaptor.entity.RuleSet;
import com.zjty.adaptationmaster.adaptor.entity.RuleSetAndRule;
import com.zjty.adaptationmaster.adaptor.repository.ProjectDao;
import com.zjty.adaptationmaster.adaptor.repository.RuleDao;
import com.zjty.adaptationmaster.adaptor.repository.RuleSetDao;
......@@ -42,8 +43,12 @@ public class RuleServiceImpl implements RuleService{
@Override
public ServerResponse addRuleSet(RuleSet ruleSet) {
List<Rule> ruleList = ruleSet.getRuleList();
if (ruleList != null) {
ruleList.forEach(rule -> rule.setRuleSet(ruleSet));
}
RuleSet save = ruleSetDao.save(ruleSet);
return ServerResponse.success(save);
return ServerResponse.success(filter(save));
}
@Override
......@@ -66,7 +71,8 @@ public class RuleServiceImpl implements RuleService{
.collect(toList());
rules.setRuleList(ruleList);
}
return ServerResponse.success(ruleSetList);
List<Rule> rules = ruleDao.findRulesInProject();
return ServerResponse.success(new RuleSetAndRule(ruleSetList,rules));
}
// @Override
......@@ -92,4 +98,13 @@ public class RuleServiceImpl implements RuleService{
rule.setStatus(0);
return ServerResponse.success("删除成功");
}
private RuleSet filter(RuleSet ruleSet){
List<Rule> rules = ruleSet.getRuleList();
if(rules != null){
List<Rule> collect = rules.stream().filter(rule -> rule.getStatus() != 0).collect(toList());
ruleSet.setRuleList(collect);
}
return ruleSet;
}
}
package com.zjty.adaptationmaster.adaptor.service;
import com.zjty.adaptationmaster.adaptor.entity.Project;
import com.zjty.adaptationmaster.adaptor.entity.Report;
import com.zjty.adaptationmaster.adaptor.entity.ReportEntity;
import com.zjty.adaptationmaster.base.response.ServerResponse;
public interface InspectService {
ServerResponse inspect(Project projectId,String uuid);
ServerResponse getReportById(Integer id);
ServerResponse getPrintReport(Integer id);
}
......@@ -16,4 +16,8 @@ public interface ProjectService {
ServerResponse deleteProject(Integer id);//删除项目
ServerResponse findProject(Integer page , Project project);//查询项目
ServerResponse deployList();
ServerResponse downLoad(Project project);//下载代码
}
package com.zjty.adaptationmaster.base.configuration;
public class ValueConfig {
}
package com.zjty.adaptationmaster.base.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
package com.zjty.adaptationmaster.base.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DeployStatus {
private boolean compile;
private boolean deploy;
private boolean running;
}
package com.zjty.adaptationmaster.base.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ProjectStatueFromMiddleware {
private String name;
private String description;
private String state;
}
......@@ -2,7 +2,12 @@ package com.zjty.adaptationmaster.base.enums;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Description : 常量
*
......@@ -19,8 +24,13 @@ public class Const {
*/
private static final Logger logger = LoggerFactory.getLogger(Const.class);
/**
* 操作台
* 适配对象项目基础地址
*/
public static final String CONSOLE = "/root/project/adaptationMaster/";
/** 上传文件地址 */
public static final String UPLOAD_LOCATION = "/root/projects/bservice/uploads/";
public static final String UPLOAD_LOCATION = "/root/projects/adaptationMaster/uploads/";
// System.getProperty("user.dir") + "\\src\\main\\resources\\uploads\\";
/** 返回值样例常量,用于swagger
* 页面的example显示 */
......@@ -28,4 +38,29 @@ public class Const {
String SERVER_RESPONSE_DATA_EXAMPLE =
"[{'name' : '设备1号', 'id' : 'K001002'},{'name' : '设备2号', 'id' : 'K003004'}]";
}
public static Map<String,Long> transferCountMap = new ConcurrentHashMap<>();
//linux环境
//public static final String MAVENHOME = "/opt/apache-maven-3.5.4";
//public static final String CTLPATH = "/home/taiyuan/桌面/AAS-V9.0/bin/appctl";
//windows环境
/* public static String MAVENHOME = "/Program Files/apache-maven-3.5.4-bin/apache-maven-3.5.4";
public static String CTLPATH = "/home/user/AAS-V9.0/bin/appctl.cmd";
public static String CTLPWD = "Qwert123!@#";*/
public static String MAVENHOME ;
public static String CTLPATH;
public static String CTLPWD;
@Value("${mavenHome.path}")
public void setMAVENHOME(String path){
MAVENHOME = path;
}
@Value("${CTLPATH}")
public void setCTLPATH(String path){
CTLPATH = path;
}
@Value("${CTLPWD}")
public void setCTLPWD(String password){
CTLPWD = password;
}
}
package com.zjty.adaptationmaster.base.response;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.zjty.adaptationmaster.utils.HttpClientUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -120,7 +121,9 @@ public class ServerResponse<T> {
public static ServerResponse uploadAndGet(
@RequestParam("file") Optional<MultipartFile> file, String dirName) {
// 空指针判断
if (!file.isPresent()) return error(NOT_NULL_PARAMETER);
if (!file.isPresent()) {
return error(NOT_NULL_PARAMETER);
}
// 上传文件并且获得相应结果
MultipartFile uploadFile = file.get();
FileServerResponse fsp =
......@@ -147,7 +150,9 @@ public class ServerResponse<T> {
public static ServerResponse deleteAndGet(
@RequestParam(value = "fileName") Optional<String> fileName, String dirName) {
// 空指针判断
if (!fileName.isPresent()) return error(NOT_NULL_PARAMETER);
if (!fileName.isPresent()) {
return error(NOT_NULL_PARAMETER);
}
// 发送删除文件的请求,附带文件所在的目录和在服务器中的文件名
FileServerResponse fsp = HttpClientUtil.daleteFileToServer(dirName, fileName.get());
// 根据返回结果的状态码确定相应的返回信息(200返回成功,否则error)
......
package com.zjty.adaptationmaster.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Objects;
/**
* Description : 设置response用来解决前后端跨域问题 Date : 2017/12/23 20:25
*
* @author : M@tr!x [xhyrzldf@foxmail.com]
*/
@Order(1)
@Component
public class MyCorsFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(MyCorsFilter.class);
/**
* Servlet过滤器,这里用来处理跨域请求HEADER问题
*
* @param req
* @param res
* @param chain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
// String url="192.168.1.111:8888/"
// 记录发送过来的request情况
// logger.info("RequestURI = {}", request.getRequestURI());
// logger.info("contentType = {}", request.getContentType());
request.getParameterMap().forEach((key, value) -> logger.info("Map -> key = {} , value = {}", key, value));
// 设置响应头的权限信息 request.getHeader("Origin")
String origin = request.getHeader("Origin");
// logger.info("request 's header is {}", origin);
if (Objects.isNull(origin)) {
response.setHeader("Access-Control-Allow-Origin", "*");
} else {
response.setHeader("Access-Control-Allow-Origin", origin);
}
// response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, PATCH, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Access-Token, Accept,token, uuid");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}
package com.zjty.adaptationmaster.config;
import com.zjty.adaptationmaster.base.enums.Const;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.io.File;
/**
* <h4>Description : businessservice</h4>
*
* @author : M@tr!x [xhyrzldf@foxmail.com]
* @Date : 2018/4/19 13:29
*/
@Configuration
public class MyWebConfig extends WebMvcConfigurationSupport/*WebMvcConfigurerAdapter*/ {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
File file1 =new File(Const.UPLOAD_LOCATION);
//如果文件夹不存在则创建
if (!file1 .exists())
{
file1 .mkdirs();
} else
{
System.out.println("//目录存在");
}
// registry.addResourceHandler("/src/main/resources/**").addResourceLocations("classpath:/resources/uploads/");
registry.addResourceHandler("/uploads/**").addResourceLocations("file:"+ Const.UPLOAD_LOCATION);
super.addResourceHandlers(registry);
}
}
package com.zjty.adaptationmaster.managerment.controller;
import com.zjty.adaptationmaster.managerment.entity.response.ServerResponse;
import com.zjty.adaptationmaster.managerment.service.AdaptationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
@RequestMapping("/adapt")
public class AdaptationController {
@Autowired
private AdaptationService adaptationService;
@GetMapping("/adapt")
public ServerResponse adapt(HttpServletResponse response) throws IOException {
System.out.println("请求");
return adaptationService.adapt(response);
}
}
package com.zjty.adaptationmaster.managerment.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
@RequestMapping("/connect")
public class SocketController implements WebSocketHandler {
int i = 0;
// @GetMapping("/get")
// public void getConnect(HttpServletResponse response){
// while (i<10){
// try {
// response.getWriter().write("第"+i+++"句话。。。");
// } catch (IOException e) {
// e.printStackTrace();
// }
// try {
// Thread.currentThread().sleep(2000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }
@Override
public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
}
@Override
public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
}
@Override
public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception {
}
@Override
public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
}
@Override
public boolean supportsPartialMessages() {
return false;
}
}
package com.zjty.adaptationmaster.managerment.entity.response;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* <p>Description : 异常结果枚举类,用于统一异常状态码与相关描述信息
* @Date : 2017/12/13 0:51
* @author : M@tr!x [xhyrzldf@foxmail.com]
*/
@AllArgsConstructor
@Getter
public enum ResponseCode {
/**
* 服务器成功返回用户请求的数据
*/
OK(200, "[GET]:服务器成功返回用户请求的数据,返回资源对象"),
/**
* 用户新建或修改数据成功
*/
CREATED(201, "[POST/PUT/PATCH]:用户新建或修改数据成功,返回新生成或修改的资源对象"),
/**
* 表示一个请求已经进入后台排队(异步任务)
*/
ACCEPTED(202, "[*]:表示一个请求已经进入后台排队(异步任务)"),
/**
* 用户上传文件成功
*/
UPLOADED(203, "[POST]文件上传成功"),
/**
* 用户删除数据成功
*/
NO_CONTENT(204, " [DELETE]:用户删除数据成功"),
/**
* 用户发出的请求有错误,服务器没有进行新建或修改数据的操作
*/
INVALID_REQUEST(400, "[POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作"),
/**
* 表示用户没有权限(令牌、用户名、密码错误)
*/
UNAUTHORIZED(401, " [*]:表示用户没有权限(令牌、用户名、密码错误)"),
/**
* 表示用户登录超时
*/
LOGINOUTTIME(402, " [*]:表示用户登录超时"),
/**
* 表示用户得到授权(与401错误相对),但是访问是被禁止的
*/
FORBIDDEN(403, " [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的"),
/**
* 用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的
*/
NOT_FOUND(404, " [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作"),
/**
* 非法参数,请求中附带的参数不符合要求规范
*/
ILLEGAL_PARAMETER(405, "[*]:非法参数,请求中附带的参数不符合要求规范"),
/**
* 用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)
*/
NOT_ACCEPTABLE(406, " [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)"),
/**
* 用户的参数不得为空
*/
NOT_NULL_PARAMETER(408, "传递的参数不能为空"),
/**
* 用户请求的资源被永久删除,且不会再得到的
*/
GONE(413, "[GET]:用户请求的资源被永久删除,且不会再得到的"),
/**
* [PUT,PATCH,POST,DELETE]:操作没有成功,并没有数据发生变化
*/
NO_CHANGED(414, "[PUT,PATCH,POST,DELETE]:操作没有成功,并没有数据发生变化"),
/**
* 创建一个对象时,发生一个验证错误
*/
UNPROCESSABLE_ENTITY(422, "[POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误"),
/**
* 服务器发生错误
*/
INTERNAL_SERVER_ERROR(500, "服务器发生错误");
/**
* 结果代码编号
*/
private Integer code;
/**
* 结果信息
*/
private String msg;
}
package com.zjty.adaptationmaster.managerment.entity.response;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Getter;
import static com.zjty.adaptationmaster.managerment.entity.response.ResponseCode.*;
/**
* Description : 结果类,用于统一返回格式 对外提供关于响应结果的很多便利的静态方法
*
* @author : M@tr!x [xhyrzldf@foxmail.com]
* @Date : 2017/12/13 0:05
*/
@SuppressWarnings({"WeakerAccess", "unused"})
@Getter
public class ServerResponse<T> {
/**
* 错误码
*/
@JSONField(ordinal = 1)
private Integer code;
/**
* 提示信息
*/
@JSONField(ordinal = 2)
private String msg;
/**
* 具体的内容
*/
@JSONField(ordinal = 3)
private T data;
/* 以下为返回成功响应结果的各类重载静态方法 */
public static <T> ServerResponse<T> success() {
return new ServerResponse<>(OK.getCode(), OK.getMsg());
}
public static <T> ServerResponse<T> success(T data) {
return new ServerResponse<>(OK.getCode(), OK.getMsg(), data);
}
public static <T> ServerResponse<T> success(String msg, T data) {
return new ServerResponse<>(OK.getCode(), msg, data);
}
public static <T> ServerResponse<T> saveSuccess(T data) {
return new ServerResponse<>(CREATED.getCode(), CREATED.getMsg(), data);
}
public static <T> ServerResponse<T> deleteSuccess() {
return new ServerResponse<>(NO_CONTENT.getCode(), NO_CONTENT.getMsg());
}
public static <T> ServerResponse<T> deleteSuccessWithCount(Number effectCount) {
return new ServerResponse<>(NO_CONTENT.getCode(), "删除成功,操作删除的数据条数为: " + effectCount);
}
public static <T> ServerResponse<T> deleteSuccessWithId(Number id) {
return new ServerResponse<>(NO_CONTENT.getCode(), "删除成功,操作删除的数据id为: " + id);
}
public static <T> ServerResponse<T> uploadSuccess(T data) {
return new ServerResponse<>(UPLOADED.getCode(), UPLOADED.getMsg(), data);
}
public static <T> ServerResponse<T> messageSuccess(String msg) {
return new ServerResponse<>(OK.getCode(), msg);
}
/* 以下为返回失败响应结果的各类重载静态方法 */
public static <T> ServerResponse<T> error() {
return new ServerResponse<>(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg());
}
public static <T> ServerResponse<T> error(String errorMessage) {
return new ServerResponse<>(INTERNAL_SERVER_ERROR.getCode(), errorMessage);
}
public static <T> ServerResponse<T> error(ResponseCode responseCode) {
return new ServerResponse<>(responseCode.getCode(), responseCode.getMsg());
}
public static <T> ServerResponse<T> error(ResponseCode responseCode, String errorMessage) {
return new ServerResponse<>(responseCode.getCode(), errorMessage);
}
public static <T> ServerResponse<T> error(ResponseCode responseCode, String errorMessage,T data) {
return new ServerResponse<>(responseCode.getCode(), errorMessage,data);
}
/* 以下为提供给CONTROL层向文件服务器操作文件获得相应结果的相关方法 */
// /**
// * <b>向文件服务器上传文件并且取得{@code {@link ServerResponse}}类型的响应结果</b>
// * <p>
// * <p>封装了control层的关于文件上传的代码
// * <p>
// * <p>例如file是a.txt,dirName=template, 在文件服务器上存放的位置就是{@code root(根目录)/template/a.txt }
// *
// * @param file {@link MultipartFile} 接受到的文件俺对象
// * @param dirName 在文件服务器上的文件夹名
// * @return {@link ServerResponse} (包含了成功与导致失败的结果)
// */
// public static ServerResponse uploadAndGet(
// @RequestParam("file") Optional<MultipartFile> file, String dirName) {
// // 空指针判断
// if (!file.isPresent()) return error(NOT_NULL_PARAMETER);
// // 上传文件并且获得相应结果
// MultipartFile uploadFile = file.get();
// FileServerResponse fsp =
// HttpClientUtil.uploadFileToServer(uploadFile, dirName, uploadFile.getOriginalFilename());
// // 根据返回结果的状态码确定相应的返回信息(200返回成功,否则error)
// return (fsp.getCode() == 200) ? uploadSuccess(fsp.getData()) : error(NO_CHANGED, fsp.getMsg());
// }
// /**
// * <b>向文件服务器删除文件并且取得{@code {@link ServerResponse}}类型的响应结果</b>
// * <p>
// * <p>封装了control层的关于文件上传的代码
// * <p>
// * <p>例如提供的参数如下
// * <li>fileName = reset-hv_20180115144834_wV9A9iVD.png
// * <li>dirName = templates
// * <li>那么实际删除的文件路径为: {@code root(根目录)/templates/reset-hv_20180115144834_wV9A9iVD.png}
// *
// * @param fileName 要删除的文件名<b>注意是文件服务器上的文件名,例如<b>reset-hv_20180115144834_wV9A9iVD.png</b> 格式为{@code
// * 原始文件名_timestamp_uuid8位}
// * @param dirName 要删除的文件所处的文件目录
// * @return {@link ServerResponse} (包含了成功与导致失败的结果)
// */
// public static ServerResponse deleteAndGet(
// @RequestParam(value = "fileName") Optional<String> fileName, String dirName) {
// // 空指针判断
// if (!fileName.isPresent()) return error(NOT_NULL_PARAMETER);
// // 发送删除文件的请求,附带文件所在的目录和在服务器中的文件名
// FileServerResponse fsp = HttpClientUtil.daleteFileToServer(dirName, fileName.get());
// // 根据返回结果的状态码确定相应的返回信息(200返回成功,否则error)
// return (fsp.getCode() == 200) ? deleteSuccess() : error(NO_CHANGED, fsp.getMsg());
// }
/* 将构造器私有,防止外部进行实例化 仅提供给内部静态方法调用 * */
private ServerResponse() {
}
private ServerResponse(Integer code) {
this.code = code;
}
private ServerResponse(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
private ServerResponse(String msg, T data) {
this.msg = msg;
this.data = data;
}
private ServerResponse(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
}
package com.zjty.adaptationmaster.managerment.service;
import com.zjty.adaptationmaster.managerment.entity.response.ServerResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public interface AdaptationService {
ServerResponse adapt(HttpServletResponse response) throws IOException;
}
package com.zjty.adaptationmaster.managerment.service.impl;
import com.zjty.adaptationmaster.adaptor.enginer.Adaptor;
import com.zjty.adaptationmaster.adaptor.entity.Rule;
import com.zjty.adaptationmaster.managerment.entity.response.ServerResponse;
import com.zjty.adaptationmaster.managerment.service.AdaptationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Service
public class AdaptationServiceImpl implements AdaptationService {
@Autowired
private Adaptor adaptor;
@Override
public ServerResponse adapt(HttpServletResponse response) throws IOException {
Rule rule = new Rule();
rule.setPathMatchType(Rule.MatchType.NAME);
rule.setPath("pom.xml");
rule.setTextMatching(Rule.TextMatch.AREA);
rule.setTarget("<groupId>||mysql||</groupId>");
rule.setReplacing("<groupId>org.postgresql</groupId>");
List<Rule> objects = new ArrayList<>();
objects.add(rule);
//Adaptor adaptor = new Adaptor(adaptationDetailLogEntityDao, originalFileDao);
adaptor.setWriter(response.getWriter());
adaptor.setRuleList(objects);
adaptor.setProjectPath("C:\\home\\project\\rsc\\hrmbclient");
adaptor.doAdapt();
return ServerResponse.success();
}
}
package com.zjty.adaptationmaster.utils;
import com.zjty.adaptationmaster.adaptor.entity.pomEntity.ProjectPom;
import com.zjty.adaptationmaster.adaptor.entity.pomEntity.SecondFloor.PomDependency;
import org.dom4j.*;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class AnalysisPom {
public static ProjectPom analysis(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();
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"));
projectPom.setName(rootElement.elementText("name"));
projectPom.setDescription(rootElement.elementText("description"));
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"));
pomDependency.setVersion(element.elementText("version"));
dependencies.add(pomDependency);
}
projectPom.setDependencies(dependencies);
return projectPom;
}
}
package com.zjty.adaptationmaster.utils;
import com.alibaba.fastjson.JSONObject;
import com.zjty.adaptationmaster.adaptor.controller.WebSocketServer;
import com.zjty.adaptationmaster.adaptor.entity.Project;
import com.zjty.adaptationmaster.base.entity.ProjectStatueFromMiddleware;
import com.zjty.adaptationmaster.base.enums.Const;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
public class ApusicDeployer {
private String ctlPath;
private String ctlPwd;
public void deploy(Project project,String webSocketName){
//String command = ctlPath+" -p "+ Const.CTLPWD +" install "+project.getProjectName()+" "+project.getReport().getPackagePath();
String command = ctlPath +" install "+project.getProjectName()+" "+project.getReport().getPackagePath();
//System.out.println(command);
appctl(command,webSocketName,project.getProjectName());
}
public List<ProjectStatueFromMiddleware> list(){
List<ProjectStatueFromMiddleware> result = new ArrayList<>();
String command = ctlPath+" list";
//System.out.println("command:" + command);
try {
Process exec = Runtime.getRuntime().exec(command);
String password = Const.CTLPWD;
OutputStream outputStream = exec.getOutputStream();
outputStream.write(password.getBytes());
outputStream.flush();
outputStream.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(exec.getInputStream(),"UTF-8"));
boolean titleEnd = false;
String line = null;
while ((line = reader.readLine()) != null) {
//System.out.println(line);
if(line.contains("---------------")){
titleEnd = true;
continue;
}
if(titleEnd){
String[] split = line.split("\\s{2,}");
ProjectStatueFromMiddleware projectStatue = null;
if(split.length < 3){
projectStatue = new ProjectStatueFromMiddleware(split[0],null,split[1]);
}else {
projectStatue = new ProjectStatueFromMiddleware(split[0],split[1],split[2]);
}
result.add(projectStatue);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
public boolean start(String projectName,String webSocketName){
String command = ctlPath+" start "+projectName;
appctl(command,webSocketName,projectName);
return true;
}
public boolean stop(String projectName,String webSocketName){
String command = ctlPath+" stop "+projectName;
appctl(command,webSocketName,projectName);
return true;
}
private void appctl(String command,String webSocketName,String projectName){
try {
System.out.println(command);
Process exec = Runtime.getRuntime().exec(command);
String password = Const.CTLPWD;
OutputStream outputStream = exec.getOutputStream();
outputStream.write(password.getBytes());
outputStream.flush();
outputStream.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(exec.getInputStream(),"UTF-8"));
String line = null;
while ((line = reader.readLine()) != null) {
WebSocketServer.sendIn(webSocketName, TimeUtil.getNowDate()+"自动部署:"+ projectName+line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
差异被折叠。
Markdown 格式
0% 或
您添加了 0 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论