parent
26172f3340
commit
a4f96eaf5c
@ -0,0 +1,12 @@
|
||||
package com.renchao.unit;
|
||||
|
||||
/**
|
||||
* @author ren_chao
|
||||
*/
|
||||
public class MyUtil {
|
||||
|
||||
|
||||
public int test(String str) {
|
||||
return Integer.parseInt(str);
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package com.renchao.unit;
|
||||
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author ren_chao
|
||||
*/
|
||||
public class UnitTestDemo {
|
||||
|
||||
private MyUtil myUtil;
|
||||
|
||||
|
||||
public int add(int a, int b) {
|
||||
|
||||
return a + b;
|
||||
}
|
||||
|
||||
public String str(Integer i) {
|
||||
return i + "a";
|
||||
}
|
||||
|
||||
public int testUtil() {
|
||||
return myUtil.test("11");
|
||||
}
|
||||
|
||||
public int testList(List<String> list) {
|
||||
return list.size() + 5;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package com.renchao.unit;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.mockito.Mockito;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.mockito.Spy;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
public class UnitTestDemoTest {
|
||||
|
||||
@Spy
|
||||
UnitTestDemo unitTestDemo;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
MockitoAnnotations.openMocks(this);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAdd() {
|
||||
UnitTestDemo mock = Mockito.mock(UnitTestDemo.class);
|
||||
|
||||
Mockito.when(mock.add(Mockito.any(Integer.class), Mockito.any(Integer.class))).thenReturn(88);
|
||||
System.out.println(mock.add(3, 2));
|
||||
|
||||
|
||||
|
||||
Mockito.when(mock.str(66)).thenReturn("66666666");
|
||||
Mockito.when(mock.str(Mockito.any(Integer.class))).thenReturn("CCCCCCC");
|
||||
System.out.println(mock.str(55));
|
||||
|
||||
Mockito.when(mock.testList(Mockito.anyList())).thenReturn(9900);
|
||||
|
||||
System.out.println(mock.testList(Collections.emptyList()));
|
||||
|
||||
}
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
package com.jiuyv.sptcc.agile.batch.dao;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.Connection;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
* DAO 基类
|
||||
*
|
||||
* @author ren_chao
|
||||
*/
|
||||
public abstract class BaseDAO {
|
||||
|
||||
protected final DataSource dataSource;
|
||||
|
||||
public BaseDAO(DataSource dataSource) {
|
||||
this.dataSource = dataSource;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据分区或日期查询记录数
|
||||
*
|
||||
*/
|
||||
public Integer getCountByDate(String table, String whereColumn, String date) throws SQLException {
|
||||
return getCount(String.format("select count(*) from %s where %s = '%s'", table, whereColumn, date));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询整个表记录数
|
||||
*
|
||||
*/
|
||||
public Integer getCountByDate(String table) throws SQLException {
|
||||
return getCount("select count(*) from " + table);
|
||||
}
|
||||
|
||||
private Integer getCount(String sql) throws SQLException {
|
||||
try (Connection connection = dataSource.getConnection();
|
||||
ResultSet resultSet = connection.prepareStatement(sql).executeQuery()) {
|
||||
resultSet.next();
|
||||
return resultSet.getInt(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,143 @@
|
||||
package com.jiuyv.sptcc.agile.batch.service;
|
||||
|
||||
import com.jiuyv.sptcc.agile.batch.config.TableProperties;
|
||||
import com.jiuyv.sptcc.agile.batch.config.sftp.SftpChannelPool;
|
||||
import com.jiuyv.sptcc.agile.batch.config.sftp.SftpProperties;
|
||||
import com.jiuyv.sptcc.agile.batch.dao.HiveDAO;
|
||||
import com.jiuyv.sptcc.agile.batch.dao.PostgreDAO;
|
||||
import com.jiuyv.sptcc.agile.batch.domain.DataInfoContainer;
|
||||
import com.jiuyv.sptcc.agile.batch.domain.ReqSyncTableDTO;
|
||||
import com.jiuyv.sptcc.agile.batch.domain.TableInfo;
|
||||
import com.jiuyv.sptcc.agile.batch.exception.ServiceException;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockedStatic;
|
||||
import org.mockito.Mockito;
|
||||
import org.mockito.Spy;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import org.springframework.core.task.TaskExecutor;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Field;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyLong;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class BatchServiceTest {
|
||||
@Mock
|
||||
private LinkedBlockingQueue<DataInfoContainer> dataQueue;
|
||||
@Mock
|
||||
private LinkedBlockingQueue<File> fileQueue;
|
||||
@Mock
|
||||
private Map<String, TableInfo> tableMapByPg;
|
||||
@Mock
|
||||
private Map<String, TableInfo> tableMapByHive;
|
||||
|
||||
@Spy
|
||||
@InjectMocks
|
||||
private TableProperties tableProperties;
|
||||
|
||||
@Mock
|
||||
private SftpProperties sftpProperties;
|
||||
@Mock
|
||||
private HiveDAO hiveDAO;
|
||||
@Mock
|
||||
private PostgreDAO postgreDAO;
|
||||
@Mock
|
||||
private SftpChannelPool sftpChannelPool;
|
||||
@Mock
|
||||
TaskExecutor executor;
|
||||
|
||||
@Test
|
||||
void syncByDate() throws Exception {
|
||||
List<ReqSyncTableDTO> tableList = Collections.singletonList(new ReqSyncTableDTO());
|
||||
TableInfo tableInfo = mock(TableInfo.class);
|
||||
when(tableMapByPg.get(null)).thenReturn(tableInfo);
|
||||
when(tableMapByHive.get(null)).thenReturn(tableInfo);
|
||||
when(dataQueue.offer(any(DataInfoContainer.class),anyLong(),any(TimeUnit.class))).thenReturn(true);
|
||||
BatchService batchService = getBatchService();
|
||||
new Thread(()->endWaiting(batchService)).start();
|
||||
batchService.syncByDate(tableList);
|
||||
|
||||
when(hiveDAO.selectList(any(), any()))
|
||||
.thenReturn(Collections.singletonList(new HashMap<>()))
|
||||
.thenReturn(null);
|
||||
new Thread(()->endWaiting(batchService)).start();
|
||||
batchService.syncByDate(tableList);
|
||||
|
||||
|
||||
ReflectionTestUtils.setField(batchService, "exception", mock(ServiceException.class));
|
||||
new Thread(()->endWaiting(batchService)).start();
|
||||
try {
|
||||
batchService.syncByDate(tableList);
|
||||
fail();
|
||||
} catch (Exception e) {
|
||||
assertTrue(e instanceof ServiceException);
|
||||
}
|
||||
|
||||
when(hiveDAO.selectList(any(), any())).thenThrow(SQLException.class);
|
||||
try {
|
||||
batchService.syncByDate(tableList);
|
||||
fail();
|
||||
} catch (Exception e) {
|
||||
assertTrue(e instanceof ServiceException);
|
||||
}
|
||||
|
||||
doThrow(SQLException.class).when(postgreDAO).clearTable(any(), any(), any());
|
||||
try {
|
||||
batchService.syncByDate(tableList);
|
||||
fail();
|
||||
} catch (Exception e) {
|
||||
assertTrue(e instanceof ServiceException);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void clearTable() {
|
||||
System.out.println(System.getProperty("os.PATHEXT"));
|
||||
}
|
||||
|
||||
private BatchService getBatchService() {
|
||||
BatchService batchService = new BatchService(tableProperties);
|
||||
ReflectionTestUtils.setField(batchService, "tableMapByPg", tableMapByPg);
|
||||
ReflectionTestUtils.setField(batchService, "tableMapByHive", tableMapByHive);
|
||||
ReflectionTestUtils.setField(batchService, "dataQueue", dataQueue);
|
||||
ReflectionTestUtils.setField(batchService, "fileQueue", fileQueue);
|
||||
return batchService;
|
||||
}
|
||||
|
||||
@SuppressWarnings("all")
|
||||
private void endWaiting(BatchService batchService) {
|
||||
try {
|
||||
Field sync = batchService.getClass().getDeclaredField("sync");
|
||||
sync.setAccessible(true);
|
||||
byte end = 3;
|
||||
while (true) {
|
||||
Byte b = (Byte) sync.get(batchService);
|
||||
if (b == 1) {
|
||||
sync.set(batchService, end);
|
||||
break;
|
||||
}
|
||||
Thread.sleep(200);
|
||||
}
|
||||
} catch (ReflectiveOperationException | InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.jiuyv.sptcc.agile.batch.dao;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import com.jiuyv.sptcc.agile.batch.entity.TblPublicFiles;
|
||||
import com.jiuyv.sptcc.agile.batch.entity.vo.TblPublicFilesVO;
|
||||
|
||||
|
||||
/**
|
||||
* 系统文件表
|
||||
* @author zhouliang
|
||||
* @date 2023-06-15
|
||||
*/
|
||||
@Mapper
|
||||
public interface TblPublicFilesMapper{
|
||||
/** 查询分页 */
|
||||
List<TblPublicFiles> selectTempFileList(TblPublicFilesVO paramMap);
|
||||
|
||||
|
||||
/** 更新数据状态 */
|
||||
void updateFileDataStatus(@Param("vo") TblPublicFiles record,@Param("map") TblPublicFilesVO paramMap);
|
||||
}
|
@ -0,0 +1,393 @@
|
||||
package com.jiuyv.sptcc.agile.batch.entity;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
/**
|
||||
* 系统文件表
|
||||
* @author zhouliang
|
||||
* @date 2023-06-15
|
||||
*/
|
||||
public class TblPublicFiles implements java.io.Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 文件主键id */
|
||||
private Long fileId;
|
||||
|
||||
/** 版本号 */
|
||||
private Long versionNum;
|
||||
|
||||
/** 随机码 */
|
||||
private String recToken;
|
||||
|
||||
/** uuid */
|
||||
private String uuid;
|
||||
|
||||
/** 文件名称 */
|
||||
private String fileName;
|
||||
|
||||
/** 文件后缀名 */
|
||||
private String fileExtension;
|
||||
|
||||
/** 文件大小 */
|
||||
private String fileSize;
|
||||
|
||||
/** 文件分类路径 */
|
||||
private String fileCategoryPath;
|
||||
|
||||
/** 文件类型 */
|
||||
private String fileType;
|
||||
|
||||
/** 文件来源 */
|
||||
private String fileSourceType;
|
||||
|
||||
/** 系统类型 */
|
||||
private String sysType;
|
||||
|
||||
/** 文件备注 */
|
||||
private String remarks;
|
||||
|
||||
/** 关联业务id */
|
||||
private String fileBusiId;
|
||||
|
||||
/** 关联业务id2 */
|
||||
private String fileBusiId2;
|
||||
|
||||
/** 关联业务id3 */
|
||||
private String fileBusiId3;
|
||||
|
||||
/** 已上传大小 */
|
||||
private String uploadSize;
|
||||
|
||||
/** 数据状态 */
|
||||
private String dataStatus;
|
||||
|
||||
/** 创建用户id */
|
||||
private String createBy;
|
||||
|
||||
/** 创建用户 */
|
||||
private String createByName;
|
||||
|
||||
/** 创建时间 */
|
||||
private Date createTime;
|
||||
|
||||
/** 更新用户id */
|
||||
private String updateBy;
|
||||
|
||||
/** 更新用户 */
|
||||
private String updateByName;
|
||||
|
||||
/** 更新时间 */
|
||||
private Date updateTime;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get文件主键id
|
||||
*/
|
||||
public Long getFileId(){
|
||||
return fileId;
|
||||
}
|
||||
/**
|
||||
* Set文件主键id
|
||||
*/
|
||||
public void setFileId(Long fileId){
|
||||
this.fileId = fileId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get版本号
|
||||
*/
|
||||
public Long getVersionNum(){
|
||||
return versionNum;
|
||||
}
|
||||
/**
|
||||
* Set版本号
|
||||
*/
|
||||
public void setVersionNum(Long versionNum){
|
||||
this.versionNum = versionNum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get随机码
|
||||
*/
|
||||
public String getRecToken(){
|
||||
return recToken;
|
||||
}
|
||||
/**
|
||||
* Set随机码
|
||||
*/
|
||||
public void setRecToken(String recToken){
|
||||
this.recToken = recToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getuuid
|
||||
*/
|
||||
public String getUuid(){
|
||||
return uuid;
|
||||
}
|
||||
/**
|
||||
* Setuuid
|
||||
*/
|
||||
public void setUuid(String uuid){
|
||||
this.uuid = uuid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get文件名称
|
||||
*/
|
||||
public String getFileName(){
|
||||
return fileName;
|
||||
}
|
||||
/**
|
||||
* Set文件名称
|
||||
*/
|
||||
public void setFileName(String fileName){
|
||||
this.fileName = fileName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get文件后缀名
|
||||
*/
|
||||
public String getFileExtension(){
|
||||
return fileExtension;
|
||||
}
|
||||
/**
|
||||
* Set文件后缀名
|
||||
*/
|
||||
public void setFileExtension(String fileExtension){
|
||||
this.fileExtension = fileExtension;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get文件大小
|
||||
*/
|
||||
public String getFileSize(){
|
||||
return fileSize;
|
||||
}
|
||||
/**
|
||||
* Set文件大小
|
||||
*/
|
||||
public void setFileSize(String fileSize){
|
||||
this.fileSize = fileSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get文件分类路径
|
||||
*/
|
||||
public String getFileCategoryPath(){
|
||||
return fileCategoryPath;
|
||||
}
|
||||
/**
|
||||
* Set文件分类路径
|
||||
*/
|
||||
public void setFileCategoryPath(String fileCategoryPath){
|
||||
this.fileCategoryPath = fileCategoryPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get文件类型
|
||||
*/
|
||||
public String getFileType(){
|
||||
return fileType;
|
||||
}
|
||||
/**
|
||||
* Set文件类型
|
||||
*/
|
||||
public void setFileType(String fileType){
|
||||
this.fileType = fileType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get文件来源
|
||||
*/
|
||||
public String getFileSourceType(){
|
||||
return fileSourceType;
|
||||
}
|
||||
/**
|
||||
* Set文件来源
|
||||
*/
|
||||
public void setFileSourceType(String fileSourceType){
|
||||
this.fileSourceType = fileSourceType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get系统类型
|
||||
*/
|
||||
public String getSysType(){
|
||||
return sysType;
|
||||
}
|
||||
/**
|
||||
* Set系统类型
|
||||
*/
|
||||
public void setSysType(String sysType){
|
||||
this.sysType = sysType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get文件备注
|
||||
*/
|
||||
public String getRemarks(){
|
||||
return remarks;
|
||||
}
|
||||
/**
|
||||
* Set文件备注
|
||||
*/
|
||||
public void setRemarks(String remarks){
|
||||
this.remarks = remarks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get关联业务id
|
||||
*/
|
||||
public String getFileBusiId(){
|
||||
return fileBusiId;
|
||||
}
|
||||
/**
|
||||
* Set关联业务id
|
||||
*/
|
||||
public void setFileBusiId(String fileBusiId){
|
||||
this.fileBusiId = fileBusiId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get关联业务id2
|
||||
*/
|
||||
public String getFileBusiId2(){
|
||||
return fileBusiId2;
|
||||
}
|
||||
/**
|
||||
* Set关联业务id2
|
||||
*/
|
||||
public void setFileBusiId2(String fileBusiId2){
|
||||
this.fileBusiId2 = fileBusiId2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get关联业务id3
|
||||
*/
|
||||
public String getFileBusiId3(){
|
||||
return fileBusiId3;
|
||||
}
|
||||
/**
|
||||
* Set关联业务id3
|
||||
*/
|
||||
public void setFileBusiId3(String fileBusiId3){
|
||||
this.fileBusiId3 = fileBusiId3;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get已上传大小
|
||||
*/
|
||||
public String getUploadSize(){
|
||||
return uploadSize;
|
||||
}
|
||||
/**
|
||||
* Set已上传大小
|
||||
*/
|
||||
public void setUploadSize(String uploadSize){
|
||||
this.uploadSize = uploadSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get数据状态
|
||||
*/
|
||||
public String getDataStatus(){
|
||||
return dataStatus;
|
||||
}
|
||||
/**
|
||||
* Set数据状态
|
||||
*/
|
||||
public void setDataStatus(String dataStatus){
|
||||
this.dataStatus = dataStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get创建用户id
|
||||
*/
|
||||
public String getCreateBy(){
|
||||
return createBy;
|
||||
}
|
||||
/**
|
||||
* Set创建用户id
|
||||
*/
|
||||
public void setCreateBy(String createBy){
|
||||
this.createBy = createBy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get创建用户
|
||||
*/
|
||||
public String getCreateByName(){
|
||||
return createByName;
|
||||
}
|
||||
/**
|
||||
* Set创建用户
|
||||
*/
|
||||
public void setCreateByName(String createByName){
|
||||
this.createByName = createByName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get创建时间
|
||||
*/
|
||||
public Date getCreateTime(){
|
||||
return createTime;
|
||||
}
|
||||
/**
|
||||
* Set创建时间
|
||||
*/
|
||||
public void setCreateTime(Date createTime){
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get更新用户id
|
||||
*/
|
||||
public String getUpdateBy(){
|
||||
return updateBy;
|
||||
}
|
||||
/**
|
||||
* Set更新用户id
|
||||
*/
|
||||
public void setUpdateBy(String updateBy){
|
||||
this.updateBy = updateBy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get更新用户
|
||||
*/
|
||||
public String getUpdateByName(){
|
||||
return updateByName;
|
||||
}
|
||||
/**
|
||||
* Set更新用户
|
||||
*/
|
||||
public void setUpdateByName(String updateByName){
|
||||
this.updateByName = updateByName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get更新时间
|
||||
*/
|
||||
public Date getUpdateTime(){
|
||||
return updateTime;
|
||||
}
|
||||
/**
|
||||
* Set更新时间
|
||||
*/
|
||||
public void setUpdateTime(Date updateTime){
|
||||
this.updateTime = updateTime;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 获取真实的文件路径
|
||||
*/
|
||||
public String getFactPath(String rootPath) {
|
||||
return rootPath+"/"+fileCategoryPath+"/"+uuid+"."+fileExtension;
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.jiuyv.sptcc.agile.batch.service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.jiuyv.sptcc.agile.batch.common.BaseTime;
|
||||
import com.jiuyv.sptcc.agile.batch.entity.TblPublicFiles;
|
||||
|
||||
|
||||
/**
|
||||
* 清理临时文件任务
|
||||
* @author zhouliang
|
||||
* @date 2023-07-05
|
||||
*/
|
||||
public interface ISftpTempFileClearService {
|
||||
|
||||
/** 获取时间 */
|
||||
public BaseTime getSysDate() throws Exception;
|
||||
|
||||
/** 获取临时文件98和传输中的97*/
|
||||
public List<TblPublicFiles> getTempFileList(String dateStr,List<String> excludeFileSourceTypes) throws Exception;
|
||||
/** 获取已删除的文件99 */
|
||||
public List<TblPublicFiles> getDeletedFileList(String dateStr) throws Exception;
|
||||
|
||||
/** 更新文件状态*/
|
||||
public void doUpdateDataStatus(List<Long> filedIds) throws Exception;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
package com.jiuyv.sptcc.agile.batch.service;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.lang3.time.DateUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.jiuyv.sptcc.agile.batch.common.BaseTime;
|
||||
import com.jiuyv.sptcc.agile.batch.common.constant.TblPublicFilesEnum;
|
||||
import com.jiuyv.sptcc.agile.batch.dao.ISysTimeBaseMapper;
|
||||
import com.jiuyv.sptcc.agile.batch.dao.TblPublicFilesMapper;
|
||||
import com.jiuyv.sptcc.agile.batch.entity.TblPublicFiles;
|
||||
import com.jiuyv.sptcc.agile.batch.entity.vo.TblPublicFilesVO;
|
||||
|
||||
|
||||
/**
|
||||
* 清理临时文件任务
|
||||
* @author zhouliang
|
||||
* @date 2023-07-05
|
||||
*/
|
||||
@Service("sftpTempFileClearService")
|
||||
public class SftpTempFileClearImpl implements ISftpTempFileClearService {
|
||||
@Autowired
|
||||
private TblPublicFilesMapper tblPublicFilesMapper;
|
||||
@Autowired
|
||||
private ISysTimeBaseMapper sysTimeBaseMapper;
|
||||
|
||||
@Override
|
||||
public List<TblPublicFiles> getTempFileList(String dateStr,List<String> excludeFileSourceTypes) throws Exception {
|
||||
TblPublicFilesVO paramMap=new TblPublicFilesVO();
|
||||
Date currdate=new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
|
||||
paramMap.setCreateTime(DateUtils.addDays(currdate, -3));
|
||||
paramMap.setUpdateTime(DateUtils.addDays(currdate, 1));//因为不含等于所以加一天
|
||||
List<String> dataStatuss=new ArrayList<>();
|
||||
dataStatuss.add(TblPublicFilesEnum.DATA_STATUS.TEMPORARY.getCode());
|
||||
dataStatuss.add(TblPublicFilesEnum.DATA_STATUS.TRANSFERRING.getCode());
|
||||
paramMap.setDataStatuss(dataStatuss);
|
||||
paramMap.setFileSourceTypes(excludeFileSourceTypes);
|
||||
return tblPublicFilesMapper.selectTempFileList(paramMap);
|
||||
}
|
||||
@Override
|
||||
public List<TblPublicFiles> getDeletedFileList(String dateStr) throws Exception {
|
||||
TblPublicFilesVO paramMap=new TblPublicFilesVO();
|
||||
Date currdate=new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
|
||||
paramMap.setCreateTime(DateUtils.addDays(currdate, -3));//预留几天,防止任务没有正常运行
|
||||
paramMap.setUpdateTime(DateUtils.addDays(currdate, 1));//因为不含等于所以加一天
|
||||
List<String> dataStatuss=new ArrayList<>();
|
||||
dataStatuss.add(TblPublicFilesEnum.DATA_STATUS.DELETED.getCode());
|
||||
paramMap.setDataStatuss(dataStatuss);
|
||||
return tblPublicFilesMapper.selectTempFileList(paramMap);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doUpdateDataStatus(List<Long> filedIds) throws Exception {
|
||||
BaseTime tmieVO = getSysDate();
|
||||
|
||||
TblPublicFiles record=new TblPublicFiles();
|
||||
record.setUpdateTime(tmieVO.getDate());
|
||||
record.setDataStatus(TblPublicFilesEnum.DATA_STATUS.CLEAR.getCode());
|
||||
|
||||
TblPublicFilesVO paramMap=new TblPublicFilesVO();
|
||||
paramMap.setFileIds(filedIds);
|
||||
tblPublicFilesMapper.updateFileDataStatus(record,paramMap);
|
||||
}
|
||||
|
||||
//获取系统时间
|
||||
@Override
|
||||
public BaseTime getSysDate() throws Exception {
|
||||
return sysTimeBaseMapper.selectSysCurrentTime();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||
<!-- 系统文件表 -->
|
||||
<mapper namespace="com.jiuyv.sptcc.agile.batch.dao.TblPublicFilesMapper">
|
||||
|
||||
<!-- 查询文件集合 -->
|
||||
<select id="selectTempFileList" resultType="com.jiuyv.sptcc.agile.batch.entity.TblPublicFiles" parameterType="com.jiuyv.sptcc.agile.batch.entity.vo.TblPublicFilesVO">
|
||||
select
|
||||
a.file_id,
|
||||
a.uuid,
|
||||
a.file_extension,
|
||||
a.file_category_path,
|
||||
a.sys_type,
|
||||
a.data_status
|
||||
from tbl_public_files a
|
||||
<where>
|
||||
and data_status in (<foreach collection="dataStatuss" item="fst" separator=",">#{fst}</foreach>)
|
||||
and update_time >= #{createTime}::timestamp
|
||||
and update_time < #{updateTime}::timestamp
|
||||
<if test="fileSourceTypes != null" >
|
||||
and file_source_type not in (<foreach collection="fileSourceTypes" item="fst" separator=",">#{fst}</foreach>)
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
|
||||
<!-- 更新数据状态 -->
|
||||
<update id="updateFileDataStatus" parameterType="com.jiuyv.sptcc.agile.batch.entity.vo.TblPublicFilesVO">
|
||||
update tbl_public_files
|
||||
set
|
||||
<if test="vo.updateBy != null" >#{vo.updateBy},</if>
|
||||
<if test="vo.updateByName != null" >#{vo.updateByName},</if>
|
||||
data_status = #{vo.dataStatus},
|
||||
update_time = #{vo.updateTime}
|
||||
where
|
||||
file_id in (<foreach collection="map.fileIds" item="fileId" separator=",">#{fileId}</foreach>)
|
||||
</update>
|
||||
|
||||
</mapper>
|
@ -1,14 +1,14 @@
|
||||
package com.jiuyv.sptccc.agile.common.annotation;
|
||||
|
||||
import com.jiuyv.sptccc.agile.common.enums.BusinessType;
|
||||
import com.jiuyv.sptccc.agile.common.enums.OperatorType;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import com.jiuyv.sptccc.agile.common.enums.BusinessType;
|
||||
import com.jiuyv.sptccc.agile.common.enums.OperatorType;
|
||||
|
||||
/**
|
||||
* 自定义操作日志记录注解
|
||||
*
|
@ -1,4 +1,4 @@
|
||||
package com.jiuyv.sptccc.agile.constant;
|
||||
package com.jiuyv.sptccc.agile.common.constant;
|
||||
|
||||
public final class FeignApiConstant {
|
||||
|
@ -1,116 +0,0 @@
|
||||
package com.jiuyv.sptccc.agile.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
public class DataApiDTO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 机构号
|
||||
*/
|
||||
private String orgNo;
|
||||
|
||||
/**
|
||||
* 机构名称
|
||||
*/
|
||||
private String orgName;
|
||||
|
||||
/**
|
||||
* 接口id
|
||||
*/
|
||||
private Long apiId;
|
||||
|
||||
/**
|
||||
* 接口名称
|
||||
*/
|
||||
private String apiName;
|
||||
|
||||
/**
|
||||
* 接口描述
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date updateTime;
|
||||
|
||||
/**
|
||||
* 生效时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date dataBegin;
|
||||
/**
|
||||
* 结束时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date dataEnd;
|
||||
|
||||
public String getOrgNo() {
|
||||
return orgNo;
|
||||
}
|
||||
|
||||
public void setOrgNo(String orgNo) {
|
||||
this.orgNo = orgNo;
|
||||
}
|
||||
|
||||
public String getOrgName() {
|
||||
return orgName;
|
||||
}
|
||||
|
||||
public void setOrgName(String orgName) {
|
||||
this.orgName = orgName;
|
||||
}
|
||||
|
||||
public Long getApiId() {
|
||||
return apiId;
|
||||
}
|
||||
|
||||
public void setApiId(Long apiId) {
|
||||
this.apiId = apiId;
|
||||
}
|
||||
|
||||
public String getApiName() {
|
||||
return apiName;
|
||||
}
|
||||
|
||||
public void setApiName(String apiName) {
|
||||
this.apiName = apiName;
|
||||
}
|
||||
|
||||
public String getRemark() {
|
||||
return remark;
|
||||
}
|
||||
|
||||
public void setRemark(String remark) {
|
||||
this.remark = remark;
|
||||
}
|
||||
|
||||
public Date getUpdateTime() {
|
||||
return updateTime;
|
||||
}
|
||||
|
||||
public void setUpdateTime(Date updateTime) {
|
||||
this.updateTime = updateTime;
|
||||
}
|
||||
|
||||
public Date getDataBegin() {
|
||||
return dataBegin;
|
||||
}
|
||||
|
||||
public void setDataBegin(Date dataBegin) {
|
||||
this.dataBegin = dataBegin;
|
||||
}
|
||||
|
||||
public Date getDataEnd() {
|
||||
return dataEnd;
|
||||
}
|
||||
|
||||
public void setDataEnd(Date dataEnd) {
|
||||
this.dataEnd = dataEnd;
|
||||
}
|
||||
}
|
@ -1,111 +0,0 @@
|
||||
package com.jiuyv.sptccc.agile.dto;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
public class DataApiStatisticsDTO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private Object id;
|
||||
|
||||
/**
|
||||
* 机构号
|
||||
*/
|
||||
private String orgNo;
|
||||
|
||||
/**
|
||||
* 机构名称
|
||||
*/
|
||||
private String orgName;
|
||||
|
||||
/**
|
||||
* API ID
|
||||
*/
|
||||
private Object apiId;
|
||||
|
||||
/**
|
||||
* 接口名称
|
||||
*/
|
||||
private String apiName;
|
||||
|
||||
/**
|
||||
* 成功次数
|
||||
*/
|
||||
private Object successTotal;
|
||||
|
||||
/**
|
||||
* 失败次数
|
||||
*/
|
||||
private Integer failTotal;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
private Date updateTime;
|
||||
|
||||
public Object getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Object id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getOrgNo() {
|
||||
return orgNo;
|
||||
}
|
||||
|
||||
public void setOrgNo(String orgNo) {
|
||||
this.orgNo = orgNo;
|
||||
}
|
||||
|
||||
public String getOrgName() {
|
||||
return orgName;
|
||||
}
|
||||
|
||||
public void setOrgName(String orgName) {
|
||||
this.orgName = orgName;
|
||||
}
|
||||
|
||||
public Object getApiId() {
|
||||
return apiId;
|
||||
}
|
||||
|
||||
public void setApiId(Object apiId) {
|
||||
this.apiId = apiId;
|
||||
}
|
||||
|
||||
public Object getSuccessTotal() {
|
||||
return successTotal;
|
||||
}
|
||||
|
||||
public void setSuccessTotal(Object successTotal) {
|
||||
this.successTotal = successTotal;
|
||||
}
|
||||
|
||||
public Integer getFailTotal() {
|
||||
return failTotal;
|
||||
}
|
||||
|
||||
public void setFailTotal(Integer failTotal) {
|
||||
this.failTotal = failTotal;
|
||||
}
|
||||
|
||||
public String getApiName() {
|
||||
return apiName;
|
||||
}
|
||||
|
||||
public void setApiName(String apiName) {
|
||||
this.apiName = apiName;
|
||||
}
|
||||
|
||||
public Date getUpdateTime() {
|
||||
return updateTime;
|
||||
}
|
||||
|
||||
public void setUpdateTime(Date updateTime) {
|
||||
this.updateTime = updateTime;
|
||||
}
|
||||
}
|
@ -1,297 +0,0 @@
|
||||
package com.jiuyv.sptccc.agile.dto;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 实验室数据上传申请
|
||||
*/
|
||||
public class DockerApplyInfoDTO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
/**
|
||||
* 申请主键id
|
||||
*/
|
||||
private Long applyId;
|
||||
|
||||
/**
|
||||
* 随机码
|
||||
*/
|
||||
private String recToken;
|
||||
|
||||
/**
|
||||
* 服务器id
|
||||
*/
|
||||
private Long dockerServerId;
|
||||
|
||||
/**
|
||||
* 申请用户id
|
||||
*/
|
||||
private String applyUserId;
|
||||
|
||||
/**
|
||||
* 申请用户
|
||||
*/
|
||||
private String applyUserName;
|
||||
|
||||
/**
|
||||
* 申请原因
|
||||
*/
|
||||
private String applyDesc;
|
||||
|
||||
/**
|
||||
* 实验室名称
|
||||
*/
|
||||
private String labTitle;
|
||||
|
||||
/**
|
||||
* 服务类型
|
||||
*/
|
||||
private String serviceType;
|
||||
|
||||
/**
|
||||
* 使用镜像
|
||||
*/
|
||||
private String dockerImageName;
|
||||
|
||||
/**
|
||||
* 申请时效
|
||||
*/
|
||||
private String usageTime;
|
||||
|
||||
/**
|
||||
* 时间单位
|
||||
*/
|
||||
private String usageTimeUnit;
|
||||
|
||||
/**
|
||||
* 开始时间
|
||||
*/
|
||||
private Date startDate;
|
||||
|
||||
/**
|
||||
* 结束时间
|
||||
*/
|
||||
private Date endDate;
|
||||
|
||||
/**
|
||||
* 延期次数
|
||||
*/
|
||||
private String delayTimes;
|
||||
|
||||
/**
|
||||
* cpu数量
|
||||
*/
|
||||
private String cpuLimits;
|
||||
|
||||
/**
|
||||
* cpu序号
|
||||
*/
|
||||
private String cpuSeq;
|
||||
|
||||
/**
|
||||
* 内存大小
|
||||
*/
|
||||
private String memoryLimits;
|
||||
|
||||
/**
|
||||
* 磁盘大小
|
||||
*/
|
||||
private String discLimits;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remarks;
|
||||
|
||||
/**
|
||||
* 审核状态
|
||||
*/
|
||||
private String reviewStatus;
|
||||
|
||||
/**
|
||||
* 驳回原因
|
||||
*/
|
||||
private String reviewDesc;
|
||||
|
||||
/**
|
||||
* 申请组件
|
||||
*/
|
||||
private List<DockerLibDTO> applyLibList;
|
||||
|
||||
public Long getApplyId() {
|
||||
return applyId;
|
||||
}
|
||||
|
||||
public void setApplyId(Long applyId) {
|
||||
this.applyId = applyId;
|
||||
}
|
||||
|
||||
public String getRecToken() {
|
||||
return recToken;
|
||||
}
|
||||
|
||||
public void setRecToken(String recToken) {
|
||||
this.recToken = recToken;
|
||||
}
|
||||
|
||||
public Long getDockerServerId() {
|
||||
return dockerServerId;
|
||||
}
|
||||
|
||||
public void setDockerServerId(Long dockerServerId) {
|
||||
this.dockerServerId = dockerServerId;
|
||||
}
|
||||
|
||||
public String getApplyUserId() {
|
||||
return applyUserId;
|
||||
}
|
||||
|
||||
public void setApplyUserId(String applyUserId) {
|
||||
this.applyUserId = applyUserId;
|
||||
}
|
||||
|
||||
public String getApplyUserName() {
|
||||
return applyUserName;
|
||||
}
|
||||
|
||||
public void setApplyUserName(String applyUserName) {
|
||||
this.applyUserName = applyUserName;
|
||||
}
|
||||
|
||||
public String getApplyDesc() {
|
||||
return applyDesc;
|
||||
}
|
||||
|
||||
public void setApplyDesc(String applyDesc) {
|
||||
this.applyDesc = applyDesc;
|
||||
}
|
||||
|
||||
public String getLabTitle() {
|
||||
return labTitle;
|
||||
}
|
||||
|
||||
public void setLabTitle(String labTitle) {
|
||||
this.labTitle = labTitle;
|
||||
}
|
||||
|
||||
public String getServiceType() {
|
||||
return serviceType;
|
||||
}
|
||||
|
||||
public void setServiceType(String serviceType) {
|
||||
this.serviceType = serviceType;
|
||||
}
|
||||
|
||||
public String getDockerImageName() {
|
||||
return dockerImageName;
|
||||
}
|
||||
|
||||
public void setDockerImageName(String dockerImageName) {
|
||||
this.dockerImageName = dockerImageName;
|
||||
}
|
||||
|
||||
public String getUsageTime() {
|
||||
return usageTime;
|
||||
}
|
||||
|
||||
public void setUsageTime(String usageTime) {
|
||||
this.usageTime = usageTime;
|
||||
}
|
||||
|
||||
public String getUsageTimeUnit() {
|
||||
return usageTimeUnit;
|
||||
}
|
||||
|
||||
public void setUsageTimeUnit(String usageTimeUnit) {
|
||||
this.usageTimeUnit = usageTimeUnit;
|
||||
}
|
||||
|
||||
public Date getStartDate() {
|
||||
return startDate;
|
||||
}
|
||||
|
||||
public void setStartDate(Date startDate) {
|
||||
this.startDate = startDate;
|
||||
}
|
||||
|
||||
public Date getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public void setEndDate(Date endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
|
||||
public String getDelayTimes() {
|
||||
return delayTimes;
|
||||
}
|
||||
|
||||
public void setDelayTimes(String delayTimes) {
|
||||
this.delayTimes = delayTimes;
|
||||
}
|
||||
|
||||
public String getCpuLimits() {
|
||||
return cpuLimits;
|
||||
}
|
||||
|
||||
public void setCpuLimits(String cpuLimits) {
|
||||
this.cpuLimits = cpuLimits;
|
||||
}
|
||||
|
||||
public String getCpuSeq() {
|
||||
return cpuSeq;
|
||||
}
|
||||
|
||||
public void setCpuSeq(String cpuSeq) {
|
||||
this.cpuSeq = cpuSeq;
|
||||
}
|
||||
|
||||
public String getMemoryLimits() {
|
||||
return memoryLimits;
|
||||
}
|
||||
|
||||
public void setMemoryLimits(String memoryLimits) {
|
||||
this.memoryLimits = memoryLimits;
|
||||
}
|
||||
|
||||
public String getDiscLimits() {
|
||||
return discLimits;
|
||||
}
|
||||
|
||||
public void setDiscLimits(String discLimits) {
|
||||
this.discLimits = discLimits;
|
||||
}
|
||||
|
||||
public String getRemarks() {
|
||||
return remarks;
|
||||
}
|
||||
|
||||
public void setRemarks(String remarks) {
|
||||
this.remarks = remarks;
|
||||
}
|
||||
|
||||
public String getReviewStatus() {
|
||||
return reviewStatus;
|
||||
}
|
||||
|
||||
public void setReviewStatus(String reviewStatus) {
|
||||
this.reviewStatus = reviewStatus;
|
||||
}
|
||||
|
||||
public String getReviewDesc() {
|
||||
return reviewDesc;
|
||||
}
|
||||
|
||||
public void setReviewDesc(String reviewDesc) {
|
||||
this.reviewDesc = reviewDesc;
|
||||
}
|
||||
|
||||
public List<DockerLibDTO> getApplyLibList() {
|
||||
return applyLibList;
|
||||
}
|
||||
|
||||
public void setApplyLibList(List<DockerLibDTO> applyLibList) {
|
||||
this.applyLibList = applyLibList;
|
||||
}
|
||||
}
|
@ -0,0 +1,113 @@
|
||||
package com.jiuyv.sptccc.agile.common.utils;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
import static com.jiuyv.sptccc.agile.common.utils.IpUtils.UNKNOWN;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
/**
|
||||
* IpUtils单元测试
|
||||
*
|
||||
* @author ren_chao
|
||||
*/
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class IpUtilsTest {
|
||||
|
||||
@Mock
|
||||
private RestTemplate restTemplate;
|
||||
|
||||
@Mock
|
||||
private ObjectMapper objectMapper;
|
||||
|
||||
@Mock
|
||||
private ResponseEntity<String> response;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() throws ReflectiveOperationException {
|
||||
Field modifier = Field.class.getDeclaredField("modifiers");
|
||||
modifier.setAccessible(true);
|
||||
|
||||
Field restTemplateField = IpUtils.class.getDeclaredField("restTemplate");
|
||||
restTemplateField.setAccessible(true);
|
||||
modifier.setInt(restTemplateField, restTemplateField.getModifiers() & ~Modifier.FINAL);
|
||||
restTemplateField.set(null, restTemplate);
|
||||
|
||||
Field objectMapperField = IpUtils.class.getDeclaredField("objectMapper");
|
||||
objectMapperField.setAccessible(true);
|
||||
modifier.setInt(objectMapperField, objectMapperField.getModifiers() & ~Modifier.FINAL);
|
||||
objectMapperField.set(null, objectMapper);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getRealAddressByIP() throws JsonProcessingException {
|
||||
String json = "{}";
|
||||
assertEquals("内网IP", IpUtils.getRealAddressByIP("192.168.0.1", true));
|
||||
|
||||
when(restTemplate.getForEntity(anyString(), eq(String.class))).thenReturn(response);
|
||||
assertEquals(UNKNOWN, IpUtils.getRealAddressByIP("localhost", true));
|
||||
|
||||
when(response.getBody()).thenReturn(json);
|
||||
assertEquals(UNKNOWN, IpUtils.getRealAddressByIP("localhost", true));
|
||||
|
||||
when(objectMapper.readTree(anyString())).thenThrow(JsonProcessingException.class);
|
||||
assertEquals(UNKNOWN, IpUtils.getRealAddressByIP("localhost", true));
|
||||
|
||||
assertEquals("内网IP", IpUtils.getRealAddressByIP("10.0.0.1", false));
|
||||
assertEquals("内网IP", IpUtils.getRealAddressByIP("172.16.0.1", false));
|
||||
assertEquals(UNKNOWN, IpUtils.getRealAddressByIP("1", false));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
void getIpAddr() {
|
||||
assertEquals("unknown", IpUtils.getIpAddr(null));
|
||||
|
||||
HttpServletRequest request = mock(HttpServletRequest.class);
|
||||
assertNull(IpUtils.getIpAddr(request));
|
||||
}
|
||||
|
||||
@Test
|
||||
void textToNumericFormatV4() {
|
||||
try {
|
||||
IpUtils.textToNumericFormatV4("127");
|
||||
IpUtils.textToNumericFormatV4("127.0");
|
||||
IpUtils.textToNumericFormatV4("127.0.0");
|
||||
IpUtils.textToNumericFormatV4("127.0.0.1");
|
||||
IpUtils.textToNumericFormatV4("127.0.0.1.1");
|
||||
|
||||
IpUtils.textToNumericFormatV4("-1");
|
||||
IpUtils.textToNumericFormatV4("-1.0");
|
||||
IpUtils.textToNumericFormatV4("-1.0.0");
|
||||
IpUtils.textToNumericFormatV4("-1.0.0.1");
|
||||
|
||||
IpUtils.textToNumericFormatV4("127.-1");
|
||||
IpUtils.textToNumericFormatV4("127.0.-1");
|
||||
IpUtils.textToNumericFormatV4("");
|
||||
} catch (Exception e) {
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void getMultistageReverseProxyIp() {
|
||||
String ip = "127.0.0.1,localhost";
|
||||
assertEquals("127.0.0.1", IpUtils.getMultistageReverseProxyIp(ip));
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,71 @@
|
||||
package com.jiuyv.sptccc.agile.common.utils;
|
||||
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockedStatic;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
/**
|
||||
* ServletUtils单元测试
|
||||
*
|
||||
* @author ren_chao
|
||||
*/
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class ServletUtilsTest {
|
||||
@Mock
|
||||
private MockedStatic<RequestContextHolder> mockStatic;
|
||||
@Mock
|
||||
private ServletRequestAttributes attributes;
|
||||
@Mock
|
||||
private HttpServletRequest request;
|
||||
@Mock
|
||||
private HttpServletResponse response;
|
||||
@Mock
|
||||
private HttpSession session;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
mockStatic.when(RequestContextHolder::getRequestAttributes).thenReturn(attributes);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
void tearDown() {
|
||||
mockStatic.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
void getRequest() {
|
||||
when(attributes.getRequest()).thenReturn(request);
|
||||
assertEquals(request, ServletUtils.getRequest());
|
||||
}
|
||||
|
||||
@Test
|
||||
void getResponse() {
|
||||
when(attributes.getResponse()).thenReturn(response);
|
||||
assertEquals(response, ServletUtils.getResponse());
|
||||
}
|
||||
|
||||
@Test
|
||||
void getRequestAttributes() {
|
||||
assertEquals(attributes, ServletUtils.getRequestAttributes());
|
||||
}
|
||||
|
||||
@Test
|
||||
void getSession() {
|
||||
when(attributes.getRequest()).thenReturn(request);
|
||||
when(request.getSession()).thenReturn(session);
|
||||
assertEquals(session, ServletUtils.getSession());
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
package com.jiuyv.sptccc.agile.common.utils;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
/**
|
||||
* StringUtil单元测试
|
||||
*
|
||||
* @author ren_chao
|
||||
*/
|
||||
class StringUtilTest {
|
||||
|
||||
@Test
|
||||
void substring() {
|
||||
String str = "testSubstring";
|
||||
assertEquals("", StringUtil.substring(str, -1, -1));
|
||||
assertEquals("g", StringUtil.substring(str, -1, 20));
|
||||
assertEquals("", StringUtil.substring(str, 1, 0));
|
||||
assertEquals("", StringUtil.substring(str, -20, -20));
|
||||
assertEquals("", StringUtil.substring(null, 0, 0));
|
||||
}
|
||||
|
||||
@Test
|
||||
void getFileExtension() {
|
||||
assertEquals("", StringUtil.getFileExtension(""));
|
||||
assertEquals("", StringUtil.getFileExtension("a"));
|
||||
assertEquals("txt", StringUtil.getFileExtension("a.txt"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void getRecToken() {
|
||||
assertEquals(10, StringUtil.getRecToken().length());
|
||||
}
|
||||
|
||||
@Test
|
||||
void strHide() {
|
||||
assertEquals("1", StringUtil.strHide("1"));
|
||||
assertEquals("13***", StringUtil.strHide("1333333"));
|
||||
assertEquals("133****3333", StringUtil.strHide("13333333"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void randomNumber() {
|
||||
assertEquals(4, StringUtil.randomNumber(2).length());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package com.jiuyv.sptccc.agile.domain;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.junit.platform.commons.util.ReflectionUtils;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Domain测试类
|
||||
*
|
||||
* @author ren_chao
|
||||
*/
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class TblDomainTest {
|
||||
|
||||
@Test
|
||||
void domainTest() {
|
||||
String packageName = "com.jiuyv.sptccc.agile.domain";
|
||||
try {
|
||||
invoke(packageName);
|
||||
} catch (Exception e) {
|
||||
Assertions.fail();
|
||||
}
|
||||
}
|
||||
|
||||
private void invoke(String packageName) throws InstantiationException, IllegalAccessException, InvocationTargetException {
|
||||
List<Class<?>> classList = ReflectionUtils.findAllClassesInPackage(packageName, aClass -> true, s -> !s.endsWith("Test"));
|
||||
|
||||
for (Class<?> aClass : classList) {
|
||||
Method[] methods = aClass.getDeclaredMethods();
|
||||
Object o = aClass.newInstance();
|
||||
for (Method method : methods) {
|
||||
String name = method.getName();
|
||||
if (name.startsWith("get")) {
|
||||
method.invoke(o);
|
||||
} else if (name.startsWith("set")) {
|
||||
Class<?>[] parameterTypes = method.getParameterTypes();
|
||||
Object[] objects = Arrays.stream(parameterTypes).map(p -> {
|
||||
try {
|
||||
return p.newInstance();
|
||||
} catch (ReflectiveOperationException e) {
|
||||
return null;
|
||||
}
|
||||
}).toArray();
|
||||
method.invoke(o, objects);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package com.jiuyv.sptccc.agile.dto;
|
||||
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.junit.platform.commons.util.ReflectionUtils;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* DTO测试类
|
||||
*
|
||||
* @author ren_chao
|
||||
*/
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class PortalDTOTest {
|
||||
|
||||
@Test
|
||||
void dtoTest() {
|
||||
String packageName = "com.jiuyv.sptccc.agile.dto";
|
||||
try {
|
||||
invoke(packageName);
|
||||
} catch (Exception e) {
|
||||
Assertions.fail();
|
||||
}
|
||||
}
|
||||
|
||||
private void invoke(String packageName) throws InstantiationException, IllegalAccessException, InvocationTargetException {
|
||||
List<Class<?>> classList = ReflectionUtils.findAllClassesInPackage(packageName, aClass -> true, s -> !s.endsWith("Test"));
|
||||
|
||||
for (Class<?> aClass : classList) {
|
||||
Method[] methods = aClass.getDeclaredMethods();
|
||||
Object o = aClass.newInstance();
|
||||
for (Method method : methods) {
|
||||
String name = method.getName();
|
||||
if (name.startsWith("get")) {
|
||||
method.invoke(o);
|
||||
} else if (name.startsWith("set")) {
|
||||
Class<?>[] parameterTypes = method.getParameterTypes();
|
||||
Object[] objects = Arrays.stream(parameterTypes).map(p -> {
|
||||
try {
|
||||
return p.newInstance();
|
||||
} catch (ReflectiveOperationException e) {
|
||||
return null;
|
||||
}
|
||||
}).toArray();
|
||||
method.invoke(o, objects);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
package com.jiuyv.sptccc.agile.common.config;
|
||||
|
||||
import org.springframework.boot.web.servlet.ServletContextInitializer;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class WebConfig {
|
||||
|
||||
/**
|
||||
* 设置JSESSIONID的Path为"/"
|
||||
*
|
||||
*/
|
||||
@Bean
|
||||
public ServletContextInitializer servletContextInitializer() {
|
||||
return servletContext -> servletContext.getSessionCookieConfig().setPath("/");
|
||||
}
|
||||
}
|
@ -1,152 +0,0 @@
|
||||
package com.jiuyv.sptccc.agile.common.core.domain;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
/**
|
||||
* Entity基类
|
||||
*
|
||||
* @author admin
|
||||
*/
|
||||
public class BaseEntity implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 创建者姓名
|
||||
*/
|
||||
private String createByName;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date createTime;
|
||||
|
||||
/**
|
||||
* 创建者id(或账户)
|
||||
*/
|
||||
private String createBy;
|
||||
|
||||
/**
|
||||
* 更新者姓名
|
||||
*/
|
||||
private String updateByName;
|
||||
|
||||
/**
|
||||
* 更新者id(或账户)
|
||||
*/
|
||||
private String updateBy;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date updateTime;
|
||||
|
||||
/**
|
||||
* 搜索值
|
||||
*/
|
||||
private String searchValue;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 请求参数
|
||||
*/
|
||||
private Map<String, Object> params;
|
||||
|
||||
/**
|
||||
* @return the createByName
|
||||
*/
|
||||
public String getCreateByName() {
|
||||
return createByName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param createByName the createByName to set
|
||||
*/
|
||||
public void setCreateByName(String createByName) {
|
||||
this.createByName = createByName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the updateByName
|
||||
*/
|
||||
public String getUpdateByName() {
|
||||
return updateByName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param updateByName the updateByName to set
|
||||
*/
|
||||
public void setUpdateByName(String updateByName) {
|
||||
this.updateByName = updateByName;
|
||||
}
|
||||
|
||||
public String getSearchValue() {
|
||||
return searchValue == null ? "" : searchValue;
|
||||
}
|
||||
|
||||
public void setSearchValue(String searchValue) {
|
||||
this.searchValue = searchValue;
|
||||
}
|
||||
|
||||
public String getCreateBy() {
|
||||
return createBy == null ? "" : createBy;
|
||||
}
|
||||
|
||||
public void setCreateBy(String createBy) {
|
||||
this.createBy = createBy;
|
||||
}
|
||||
|
||||
public Date getCreateTime() {
|
||||
return createTime;
|
||||
}
|
||||
|
||||
public void setCreateTime(Date createTime) {
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
public String getUpdateBy() {
|
||||
return updateBy == null ? "" : updateBy;
|
||||
}
|
||||
|
||||
public void setUpdateBy(String updateBy) {
|
||||
this.updateBy = updateBy;
|
||||
}
|
||||
|
||||
public Date getUpdateTime() {
|
||||
return updateTime;
|
||||
}
|
||||
|
||||
public void setUpdateTime(Date updateTime) {
|
||||
this.updateTime = updateTime;
|
||||
}
|
||||
|
||||
public String getRemark() {
|
||||
return remark == null ? "" : remark;
|
||||
}
|
||||
|
||||
public void setRemark(String remark) {
|
||||
this.remark = remark;
|
||||
}
|
||||
|
||||
public Map<String, Object> getParams() {
|
||||
if (params == null) {
|
||||
params = new HashMap<>();
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
public void setParams(Map<String, Object> params) {
|
||||
this.params = params;
|
||||
}
|
||||
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
package com.jiuyv.sptccc.agile.common.enums;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.lang.Nullable;
|
||||
|
||||
/**
|
||||
* 请求方式
|
||||
*
|
||||
* @author admin
|
||||
*/
|
||||
public enum HttpMethod {
|
||||
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;
|
||||
|
||||
private static final Map<String, HttpMethod> mappings = new HashMap<>(16);
|
||||
|
||||
static {
|
||||
for (HttpMethod httpMethod : values()) {
|
||||
mappings.put(httpMethod.name(), httpMethod);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static HttpMethod resolve(@Nullable String method) {
|
||||
return (method != null ? mappings.get(method) : null);
|
||||
}
|
||||
|
||||
public boolean matches(String method) {
|
||||
return (this == resolve(method));
|
||||
}
|
||||
}
|
@ -1,273 +0,0 @@
|
||||
package com.jiuyv.sptccc.agile.common.utils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude.Include;
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.core.JsonGenerator.Feature;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.JavaType;
|
||||
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||
import com.fasterxml.jackson.databind.introspect.Annotated;
|
||||
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.jiuyv.sptccc.agile.common.annotation.SensitiveData;
|
||||
import com.jiuyv.sptccc.agile.common.utils.jackson.MaskSensitiveDataSerializerProvider;
|
||||
|
||||
/**
|
||||
* @author zhouliang
|
||||
*/
|
||||
public abstract class JsonUtil {
|
||||
|
||||
/**
|
||||
* The Constant LOGGER.
|
||||
*/
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(JsonUtil.class);
|
||||
|
||||
private JsonUtil() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
}
|
||||
|
||||
/**
|
||||
* The object mapper.
|
||||
*/
|
||||
private static ObjectMapper objectMapper = new ObjectMapper();
|
||||
//专门使用一个独立的,处理敏感字段等
|
||||
private static ObjectMapper objectMapper2 = new ObjectMapper();
|
||||
|
||||
static {
|
||||
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
|
||||
objectMapper.setSerializationInclusion(Include.NON_NULL);
|
||||
objectMapper.configure(Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
|
||||
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
|
||||
|
||||
|
||||
objectMapper2.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
|
||||
objectMapper2.setSerializationInclusion(Include.NON_NULL);
|
||||
objectMapper2.configure(Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
|
||||
objectMapper2.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
|
||||
// 启用自定义注解功能
|
||||
objectMapper2.setAnnotationIntrospector(new JsonUtil.SensitiveDataIntrospector());
|
||||
objectMapper2.setSerializerProvider(new MaskSensitiveDataSerializerProvider());
|
||||
}
|
||||
|
||||
public static ObjectMapper JsonMapper() {
|
||||
return objectMapper;
|
||||
}
|
||||
|
||||
public static ObjectMapper JsonMapper2() {
|
||||
return objectMapper2;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过注解处理敏感字段,自行在需要的注入
|
||||
*
|
||||
* @author zhouliang
|
||||
*/
|
||||
public static class SensitiveDataIntrospector extends JacksonAnnotationIntrospector {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Object findSerializer(Annotated annotated) {
|
||||
if (annotated.hasAnnotation(SensitiveData.class)) {
|
||||
SensitiveData sensitiveDataProperty = annotated.getAnnotation(SensitiveData.class);
|
||||
return new JsonSerializer<String>() {
|
||||
@Override
|
||||
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
|
||||
if (value != null) {
|
||||
String val = StringUtil.padl("", 6, sensitiveDataProperty.defaultMark());
|
||||
//大于允许截取
|
||||
if (value.length() * 2 / 3 >= (sensitiveDataProperty.firstLength() + sensitiveDataProperty.endLength())) {
|
||||
gen.writeString(value.substring(0, sensitiveDataProperty.firstLength()) + val + value.substring(value.length() - sensitiveDataProperty.endLength()));
|
||||
} else {
|
||||
gen.writeString(val);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
return super.findSerializer(annotated);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 转为json字符串
|
||||
*
|
||||
* @param object the object
|
||||
* @return the string
|
||||
*/
|
||||
public static String toJSONString(Object object) {
|
||||
try {
|
||||
return objectMapper.writeValueAsString(object);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("convert failed", e);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* json字符串转为对象
|
||||
*
|
||||
* @param <T>
|
||||
* @param json
|
||||
* @param clz
|
||||
* @return
|
||||
*/
|
||||
public static <T> T json2Bean(String json, Class<T> clz) {
|
||||
try {
|
||||
return objectMapper.readValue(json, clz);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("convert failed", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* json字符串转为对象
|
||||
*
|
||||
* @param <T>
|
||||
* @param json
|
||||
* @param clz
|
||||
* @return
|
||||
*/
|
||||
public static <T> T json2Bean(String json, JavaType clz) {
|
||||
try {
|
||||
return objectMapper.readValue(json, clz);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("convert failed", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转为对象集合
|
||||
*
|
||||
* @param <T>
|
||||
* @param json
|
||||
* @param clz
|
||||
* @return
|
||||
*/
|
||||
public static <T> List<T> json2List(String json, Class<T> clz) {
|
||||
try {
|
||||
JavaType javaType = getCollectionType(ArrayList.class, clz);
|
||||
return objectMapper.readValue(json, javaType);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("convert failed", e);
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取泛型的Collection Type
|
||||
*
|
||||
* @param collectionClass 泛型的Collection
|
||||
* @param elementClasses 元素类
|
||||
* @return JavaType Java类型
|
||||
* @since 1.0
|
||||
*/
|
||||
public static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {
|
||||
return objectMapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
|
||||
}
|
||||
|
||||
/**
|
||||
* json字符转ArrayNode
|
||||
*
|
||||
* @param json
|
||||
* @return
|
||||
*/
|
||||
public static ArrayNode parseArray(String json) {
|
||||
try {
|
||||
return (ArrayNode) objectMapper.readTree(json);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("convert failed", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* json字符转ObjectNode
|
||||
*
|
||||
* @param json
|
||||
* @return
|
||||
*/
|
||||
public static ObjectNode parseObject(String json) {
|
||||
try {
|
||||
return (ObjectNode) objectMapper.readTree(json);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("convert failed", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建ArrayNode
|
||||
*
|
||||
* @param json
|
||||
* @return
|
||||
*/
|
||||
public static ArrayNode createArray() {
|
||||
return objectMapper.createArrayNode();
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建ObjectNode
|
||||
*
|
||||
* @param json
|
||||
* @return
|
||||
*/
|
||||
public static ObjectNode createObject() {
|
||||
return objectMapper.createObjectNode();
|
||||
}
|
||||
|
||||
/**
|
||||
* 集合实体对象转ArrayNode
|
||||
*
|
||||
* @param json
|
||||
* @return
|
||||
*/
|
||||
public static ArrayNode toArray(Object obj) {
|
||||
try {
|
||||
return objectMapper.valueToTree(obj);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("convert failed", e);
|
||||
return createArray();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 实体对象转ObjectNode
|
||||
*
|
||||
* @param json
|
||||
* @return
|
||||
*/
|
||||
public static ObjectNode toObject(Object obj) {
|
||||
try {
|
||||
return objectMapper.valueToTree(obj);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("convert failed", e);
|
||||
return createObject();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 拷贝对象
|
||||
* 主要还是是用于Node拷贝
|
||||
*/
|
||||
public static <K, V> void copyProperties(K source, V target) {
|
||||
try {
|
||||
objectMapper.updateValue(target, source);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("convert failed", e);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
package com.jiuyv.sptccc.agile.common.utils.ip;
|
||||
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.jiuyv.sptccc.agile.common.config.ConsoleConfig;
|
||||
import com.jiuyv.sptccc.agile.common.utils.JsonUtil;
|
||||
import com.jiuyv.sptccc.agile.common.utils.SpringUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.boot.web.client.RestTemplateBuilder;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
/**
|
||||
* 获取地址类
|
||||
*
|
||||
* @author admin
|
||||
*/
|
||||
public class AddressUtils {
|
||||
// IP地址查询
|
||||
public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";
|
||||
// 未知地址
|
||||
public static final String UNKNOWN = "XX XX";
|
||||
private static final Logger log = LoggerFactory.getLogger(AddressUtils.class);
|
||||
private static final ConsoleConfig consoleProperties;
|
||||
private static final RestTemplate restTemplate;
|
||||
|
||||
static {
|
||||
consoleProperties = SpringUtils.getBean(ConsoleConfig.class);
|
||||
restTemplate = SpringUtils.getBean(RestTemplateBuilder.class).build();
|
||||
}
|
||||
|
||||
public static String getRealAddressByIP(String ip) {
|
||||
// 内网不查询
|
||||
if (IpUtils.internalIp(ip)) {
|
||||
return "内网IP";
|
||||
}
|
||||
if (consoleProperties.isAddressEnabled()) {
|
||||
String rspStr = restTemplate.getForEntity(IP_URL + "?ip=" + ip + "&json=true", String.class).getBody();
|
||||
if (StringUtils.isBlank(rspStr)) {
|
||||
log.error("获取地理位置异常 {}", ip);
|
||||
return UNKNOWN;
|
||||
}
|
||||
ObjectNode obj = JsonUtil.parseObject(rspStr);
|
||||
assert obj != null;
|
||||
return obj.get("pro").asText() + " " + obj.get("city").asText();
|
||||
}
|
||||
return UNKNOWN;
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.jiuyv.sptccc.agile.common.config;
|
||||
package com.jiuyv.sptccc.agile.framework.config;
|
||||
|
||||
import com.anji.captcha.model.common.Const;
|
||||
import com.anji.captcha.service.CaptchaCacheService;
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue