packagexxxxxxxx;importcn.hutool.json.JSONObject;importcom.alibaba.fastjson.JSON;importlombok.extern.slf4j.Slf4j;importnet.evecom.scplatform.common.entry.CommonResp;importnet.evecom.scplatform.common.entry.system.CommonEntry;importnet.evecom.scplatform.common.entry.system.UserUtil;importnet.evecom.scplatform.common.utils.text.IDUtils;import net.evecom.scplatform.openapi.dao.*;import net.evecom.scplatform.openapi.entity.*;importnet.evecom.scplatform.openapi.entity.dto.SwaggerHtmlDto;importnet.evecom.scplatform.openapi.service.SwaggerJsonImportService;importnet.evecom.scplatform.openapi.util.SwaggerJsonUtils;importorg.apache.commons.lang3.StringUtils;importorg.apache.http.HttpEntity;importorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClientBuilder;importorg.apache.http.util.EntityUtils;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;importorg.springframework.util.CollectionUtils;importorg.springframework.web.client.RestTemplate;importjava.io.IOException;importjava.io.InputStream;importjava.net.HttpURLConnection;importjava.net.URL;importjava.text.SimpleDateFormat;import java.util.*;/***@authorTorres Liu
* @description //TODO 服务导入/导出 业务层
* @date 2020-04-10 14:06 下午
**/@SuppressWarnings({"unchecked", "rawtypes"})
@Slf4j
@Service
@Transactional(rollbackFor= Exception.class)public class SwaggerJsonImportServiceImpl implementsSwaggerJsonImportService {
@AutowiredprivateRestTemplate restTemplate;
@AutowiredprivateServiceCatalogDao serviceCatalogDao;
@AutowiredprivateServiceResourceDao serviceResourceDao;
@AutowiredprivateServiceRequestDao serviceRequestDao;
@AutowiredprivateResponseStatusDao responseStatusDao;
@AutowiredprivateServiceResponseDao serviceResponseDao;
@AutowiredprivateServiceCatalogRelaDao serviceCatalogRelaDao;
@Value("${kong.server-addr}")privateString kongServerAddr;/*** array*/
private static final String ARRAY_VAL = "array";/*** $ref*/
private static final String REF_VAL = "$ref";/*** format*/
private static final String FORMAT_VAL = "format";/*** schema*/
private static final String SCHEMA_VAL = "schema";/*** 成功的code*/
private static final int SUCCESS_CODE = 200;/*** 递归次数*/
private static final int RECURSION_NUMS = 199;/*** 通过JSON或URL导入服务
*
*@paramjsonUrl
*@paramserviceSwagger
*@paramisAuthorized
*@returnnet.evecom.scplatform.common.entry.CommonResp
*@authorTorres Liu
* @description //TODO 通过JSON或URL导入服务
* @date 2020/4/24 5:46 下午
**/@Override
@Transactional(rollbackFor= Exception.class)public CommonResp swaggerJsonImport(String jsonUrl, ServiceSwagger serviceSwagger, String isAuthorized) throwsIOException {
String jsonStr= "";
CloseableHttpClient httpClient=HttpClientBuilder.create().build();//提前生成 一级标题的id字段 by liumingyu
String firstTitleUuid =IDUtils.new32UUID();//获取前端传入的是否授权标识 by liumingyu
String isAuthorizedAccessStr = StringUtils.defaultIfBlank(isAuthorized, "0");
Integer isAuthorizedAccess=Integer.valueOf(isAuthorizedAccessStr);try{//判断是通过url or json传入数据 by liumingyu
if (!StringUtils.isBlank(jsonUrl) && "".equals(serviceSwagger.getSwaggerJson())) {//判断url的有效性
boolean urlValidity =ifUrlValidity(jsonUrl);//判断url是否是swagger的url
boolean swaggerUrl =ifSwaggerUrl(jsonUrl);if (urlValidity &&swaggerUrl) {
HttpGet httpGet= newHttpGet(jsonUrl);
CloseableHttpResponse response=httpClient.execute(httpGet);if (response.getStatusLine().getStatusCode() ==SUCCESS_CODE) {
HttpEntity entity=response.getEntity();
String string= EntityUtils.toString(entity, "utf-8");
jsonStr=string;
}
response.close();
httpClient.close();
}else{return CommonResp.exception("传入的url不正确!");
}
}else if (serviceSwagger != null && !"".equals(serviceSwagger.getSwaggerJson())) {
String swaggerJson=serviceSwagger.getSwaggerJson();//判断字符串是否为json格式
boolean isJson =isJson(swaggerJson);if(isJson) {
JSONObject jsonObject= newJSONObject(swaggerJson);
Object o=JSON.toJSON(jsonObject);
jsonStr=com.alibaba.fastjson.JSONObject.toJSONString(o);
}else{return CommonResp.exception("传入的json格式不正确!");
}
}else{return CommonResp.exception("服务导入URL或JSON出错!");
}//获取当前租户
String gmtTenant =UserUtil.getLoginUser().getGmtTenant();//获取当前用户id
String userId =UserUtil.getLoginUser().getId();
String gmtCreator= (userId != null) ? userId : "";//转换 JSON string to Map by liumingyu
Map map = SwaggerJsonUtils.readValue(jsonStr, HashMap.class);//解析info by liumingyu
Map infoMap = (Map) map.get("info");//拿到一级标题 by liumingyu
String catalogName = (String) infoMap.get("title");//拿到所有二级标题(类标题)的List by liumingyu
List> tags = (List>) map.get("tags");//如果表中没有该一级标题名称,需要新增一个 by liumingyu
if (catalogName != null) {//查询库中是否有当前登录用户且pid为-1的根目录
ServiceCatalog catalogBeanByCreatorAndPid = serviceCatalogDao.findByCreatorAndPid(gmtCreator, "-1");//查询库中是否存在该一级标题名称 by liumingyu
ServiceCatalog catalogBean =serviceCatalogDao.findByCatalogNameAndCreator(gmtCreator, catalogName);//若不存在该标题名称,新增一级目录和二级目录 by liumingyu//1.插入一级二级标题数据到服务目录表 by liumingyu
if (catalogBean == null && catalogBeanByCreatorAndPid != null) {
ServiceCatalog serviceCatalog= newServiceCatalog();
serviceCatalog.setId(firstTitleUuid);//将根目录id作为一级目录的pid
serviceCatalog.setPid(catalogBeanByCreatorAndPid.getId());
serviceCatalog.setCatalogName(catalogName);
serviceCatalogDao.add(serviceCatalog);//添加二级标题(目录)by liumingyu
addTags(tags, firstTitleUuid, gmtTenant, gmtCreator);
}else{//存在的话只要新增二级标题 by liumingyu//拿到该一级目录的id by liumingyu
if (catalogBean != null && catalogBean.getId() != null) {
String fatherId=catalogBean.getId();//添加二级标题(目录)by liumingyu
addTags(tags, fatherId, gmtTenant, gmtCreator);
}
}
}//解析model by liumingyu
Map definitinMapOld =parseDefinitions(map);
Map> definitinMap =newParseDefinitions(map);//获取服务版本(取得是一级info的版本号)by liumingyu
String version = (String) infoMap.get("version");//解析paths by liumingyu
Map> paths = (Map>) map.get("paths");//解析bashPath by liumingyu
String basePath = (String) map.get("basePath");
String[] basePathSplit= null;if (basePath != null && !"".equals(basePath)) {
basePathSplit= basePath.split(",");
}if (paths != null) {//通过entrySet()取出映射关系,iterator()迭代,存放到迭代器中 by liumingyu
Iterator>> it =paths.entrySet().iterator();//开始遍历paths by liumingyu
while(it.hasNext()) {//拿到单个path的数据信息,用map的Entry对象存起来 by liumingyu
Map.Entry> path =it.next()