From 41ca3a0057684366187c0cccd948d9b833d56893 Mon Sep 17 00:00:00 2001 From: Kaixuan Shi Date: Fri, 14 Oct 2022 11:08:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Erest-api-provider-dev?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + rest-api-provider-dev/pom.xml | 48 +++ .../sgf/dt/provider/common/EapiBuilder.java | 302 ++++++++++++++++++ .../dt/provider/config/EapiBeanConfig.java | 47 +++ .../service/SimpleViewModelProvider.java | 97 ++++++ .../provider/service/ViewModelProvider.java | 82 +++++ .../sgf/dt/provider/utils/MetadataUtils.java | 102 ++++++ .../main/resources/META-INF/spring.factories | 1 + 8 files changed, 680 insertions(+) create mode 100644 rest-api-provider-dev/pom.xml create mode 100644 rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/common/EapiBuilder.java create mode 100644 rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/config/EapiBeanConfig.java create mode 100644 rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/SimpleViewModelProvider.java create mode 100644 rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/ViewModelProvider.java create mode 100644 rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/utils/MetadataUtils.java create mode 100644 rest-api-provider-dev/src/main/resources/META-INF/spring.factories diff --git a/pom.xml b/pom.xml index 923d1df..f90ebf8 100644 --- a/pom.xml +++ b/pom.xml @@ -9,6 +9,7 @@ rest-api-service-dev rest-api-spi-dev rest-api-utils + rest-api-provider-dev diff --git a/rest-api-provider-dev/pom.xml b/rest-api-provider-dev/pom.xml new file mode 100644 index 0000000..8e649fb --- /dev/null +++ b/rest-api-provider-dev/pom.xml @@ -0,0 +1,48 @@ + + + + rest-api-model + com.inspur.edp + 0.2.0 + + 4.0.0 + + rest-api-provider-dev + + + + + com.inspur.edp + rest-api-metadata + ${project.version} + compile + + + com.inspur.edp + rest-api-spi-dev + ${project.version} + compile + + + com.inspur.edp + formserver-viewmodel + 0.2.7 + compile + + + com.inspur.edp + rest-api-provider-common + ${project.version} + compile + + + io.iec.edp + caf-boot-commons-multicontext + 0.3.9 + + + + + \ No newline at end of file diff --git a/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/common/EapiBuilder.java b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/common/EapiBuilder.java new file mode 100644 index 0000000..911d856 --- /dev/null +++ b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/common/EapiBuilder.java @@ -0,0 +1,302 @@ +/* + * Copyright © OpenAtom Foundation. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.inspur.edp.sgf.dt.provider.common; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.inspur.edp.formserver.viewmodel.GspViewModel; +import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; +import com.inspur.edp.lcm.metadata.api.entity.MetadataHeader; +import com.inspur.edp.lcm.metadata.api.entity.MetadataProject; +import com.inspur.edp.lcm.metadata.api.service.FileService; +import com.inspur.edp.lcm.metadata.api.service.MetadataService; +import com.inspur.edp.lcm.metadata.api.service.NoCodeService; +import com.inspur.edp.sgf.api.common.ResourceType; +import com.inspur.edp.sgf.api.entity.ServiceDefine; +import com.inspur.edp.sgf.api.entity.ServiceOperation; +import com.inspur.edp.sgf.api.entity.ServiceParameter; +import com.inspur.edp.sgf.api.entity.SgMetadata; +import com.inspur.edp.sgf.api.entity.SgModel; +import com.inspur.edp.sgf.api.utils.ObjectMapperUtil; +import com.inspur.edp.sgf.dt.provider.utils.MetadataUtils; +import com.inspur.edp.sgf.provider.vo.utils.SimpleViewModelUtils; +import com.inspur.edp.sgf.provider.vo.utils.ViewModelUtils; +import io.iec.edp.caf.businessobject.api.entity.DevBasicBoInfo; +import io.iec.edp.caf.commons.utils.SpringBeanUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +/** + * 功能描述: @ClassName: EapiBuilder @Author: Fynn Qi @Date: 2020/12/24 9:17 @Version: V1.0 + */ +public class EapiBuilder { + + private final String EAPI_RESOURCE_TYPE_VO = "VO"; + private final String EAPI_RESOURCE_TYPE_VO_SIMPLE = "VO-Simple"; + private final String EAPI_TYPE_NAME = "ExternalApi"; + private final String EAPI_SUFFIX_NAME = ".eapi"; + private final String EAPI_PATH = "/eapi"; + private ResourceType resourceType; + + public GspMetadata updateEapi(String eapiMetadataId, GspMetadata voMetadata, ResourceType resourceType) { + this.resourceType = resourceType; + NoCodeService noCodeService = SpringBeanUtils.getBean(NoCodeService.class); + GspMetadata metadata = noCodeService.getMetadata(eapiMetadataId); + //构造Header + metadata.setHeader(updateMetadataHeader(voMetadata, metadata)); + //构造Content + metadata.setContent(buildEapiMetadataDefine(voMetadata, metadata)); + //构造扩展属性 + ObjectNode extension = getEapiMetadataExtendProperties(metadata); + metadata.setExtendProperty(ObjectMapperUtil.serialize(extension)); + noCodeService.saveMetadata(metadata); + return metadata; + } + + private ObjectNode getEapiMetadataExtendProperties(GspMetadata metadata) { + ObjectNode node = ObjectMapperUtil.getMapper().createObjectNode(); + node.put("metadataVersion", UUID.randomUUID().toString()); + node.put("resourceType", ((SgMetadata) metadata.getContent()).getService().getResourceType()); + node.put("resourceId", ((SgMetadata) metadata.getContent()).getService().getResourceId()); + node.put("uri", ((SgMetadata) metadata.getContent()).getRouter()); + return node; + } + + private MetadataHeader updateMetadataHeader(GspMetadata voMetadata, GspMetadata eapiMetadata) { + //获取当前需要更新的运行时定制元数据的Header + MetadataHeader header = eapiMetadata.getHeader(); + // 编号和名称取自运行时定制扩展的VO元数据,VO的编号和名称已作出对应的扩展调整 + header.setCode(voMetadata.getHeader().getCode()); + header.setName(voMetadata.getHeader().getName()); + // 是否允许扩展,与VO同步 + header.setExtendable(voMetadata.getHeader().isExtendable()); + return header; + } + + public GspMetadata buildEapi(GspMetadata voMetadata, ResourceType resourceType) { + this.resourceType = resourceType; + GspMetadata metadata = new GspMetadata(); + // 初始化Header信息 + metadata.setHeader(buildEapiMetadataHeader(voMetadata)); + //构造Content + metadata.setContent(buildEapiMetadataDefine(voMetadata, metadata)); + //构造扩展属性 + ObjectNode extension = getEapiMetadataExtendProperties(metadata); + metadata.setExtendProperty(ObjectMapperUtil.serialize(extension)); + NoCodeService noCodeService = SpringBeanUtils.getBean(NoCodeService.class); + noCodeService.saveMetadata(metadata); + return metadata; + } + + public GspMetadata buildEapi(GspMetadata voMetadata, String path, ResourceType resourceType) { + this.resourceType = resourceType; + // 初始化Header信息 + GspMetadata eapiMetadata = buildEapiMetadataBaseInfo(voMetadata, path); + // 生成元数据content + eapiMetadata = buildEapiMetadataFileContent(voMetadata, eapiMetadata); + return eapiMetadata; + } + + private GspMetadata buildEapiMetadataFileContent(GspMetadata voMetadata, GspMetadata eapiMetadata) { + List metadataTypeList = new ArrayList<>(); + metadataTypeList.add(EAPI_SUFFIX_NAME); + MetadataService metadataService = SpringBeanUtils.getBean(MetadataService.class); + String eapiRelativePath = eapiMetadata.getRelativePath(); + List metadataList = metadataService.getMetadataList(eapiRelativePath, metadataTypeList); + if (metadataList != null && metadataList.size() > 0) { + String metadataCode = eapiMetadata.getHeader().getCode(); + boolean exist = metadataList.stream().anyMatch(x -> metadataCode.equalsIgnoreCase(x.getHeader().getCode())); + //如果不存在当前编号的EAPI元数据,则直接创建 + if (!exist) { + // 元数据初始化 + eapiMetadata = metadataService.initializeMetadataEntity(eapiMetadata); + // 创建元数据 + metadataService.createMetadata(eapiRelativePath, eapiMetadata); + } + } else { + // 元数据初始化 + eapiMetadata = metadataService.initializeMetadataEntity(eapiMetadata); + // 创建元数据 + metadataService.createMetadata(eapiRelativePath, eapiMetadata); + } + // 加载元数据 + eapiMetadata = metadataService.loadMetadata(eapiMetadata.getHeader().getFileName(), eapiRelativePath); + // eapi赋值给元数据的content + eapiMetadata.setContent(buildEapiMetadataDefine(voMetadata, eapiMetadata)); + // 保存元数据,元数据设置扩展属性 + ObjectNode extension = getEapiMetadataExtendProperties(eapiMetadata); + eapiMetadata.setExtendProperty(ObjectMapperUtil.serialize(extension)); + // 元数据保存所需要的完整路径 + String fullPath = String.format("%s/%s%s", eapiRelativePath, eapiMetadata.getHeader().getCode(), EAPI_SUFFIX_NAME); + metadataService.saveMetadata(eapiMetadata, fullPath); + return eapiMetadata; + } + + private SgMetadata buildEapiMetadataDefine(GspMetadata vo, GspMetadata eapiMetadata) { + SgMetadata eapiContent = new SgMetadata(); + // 定义SG外部服务基本信息 + eapiContent.setId(eapiMetadata.getHeader().getId()); + eapiContent.setCode(eapiMetadata.getHeader().getCode()); + eapiContent.setName(eapiMetadata.getHeader().getName()); + eapiContent.setBizObject(eapiMetadata.getHeader().getBizobjectID()); + DevBasicBoInfo boInfo = MetadataUtils.getDevBasicBoInfo(eapiMetadata.getHeader().getBizobjectID()); + eapiContent.setCriticalApplication(boInfo.getAppCode().toLowerCase()); + eapiContent.setServiceUnit(boInfo.getSuCode().toLowerCase()); + String boCode = ""; + if (boInfo.getBoInfo() != null && StringUtils.isNotBlank(boInfo.getBoInfo().getCode())) { + boCode = boInfo.getBoInfo().getCode(); + } + //TODO 后续修改为下面的生成方式 + // route的默认生成方式:BO的编号_VO元数据的编号 + eapiContent.setRouteUrl(vo.getHeader().getCode().toLowerCase()); + //eapiContent.setRouteUrl(String.format("%s_%s", boCode.toLowerCase(), vo.getHeader().getCode().toLowerCase())); + // 版本信息,默认1.0 + eapiContent.setVersion("1.0"); + eapiContent.setDescription(vo.getHeader().getCode() + "服务"); + // 生成服务定义 + eapiContent.setService(this.buildServiceDefine(vo)); + // 获取服务模型列表 + eapiContent.getModels().addAll(getServiceModels(eapiContent)); + return eapiContent; + } + + private List getServiceModels(SgMetadata eapiContent) { + List models = new ArrayList<>(); + Set modelsIdsSet = new HashSet<>(); + if (eapiContent.getService().getOperations().size() <= 0) { + return models; + } + for (ServiceOperation operation : eapiContent.getService().getOperations()) { + if (operation.getParameters() == null || operation.getParameters().size() <= 0) { + continue; + } + for (ServiceParameter parameter : operation.getParameters()) { + if (parameter.isBasicType() || parameter.getRefId().equals("object") || parameter.getModelId().equals("object")) { + continue; + } + SgModel sgModel = getModelProperty(parameter); + //判断eapi中是否已存在 + long count = + eapiContent.getModels().stream() + .filter(x -> x.getId().equalsIgnoreCase(sgModel.getId())) + .count(); + if (count <= 0) { + //判断本次models中是否已添加 + if (!modelsIdsSet.contains(sgModel.getId())) { + models.add(sgModel); + modelsIdsSet.add(sgModel.getId()); + } + } + } + } + return models; + } + + private SgModel getModelProperty(ServiceParameter param) { + SgModel sgModel = new SgModel(); + sgModel.setId(param.getRefId()); + sgModel.setCode(param.getRefCode()); + sgModel.setName(param.getRefName()); + sgModel.setModelId(param.getModelId()); + sgModel.setModelCode(param.getModelCode()); + sgModel.setModelName(param.getModelName()); + sgModel.setRelativePath(param.getRefPath()); + sgModel.setFileName(param.getRefFileName()); + sgModel.setModelType(param.getModelType()); + return sgModel; + } + + private ServiceDefine buildServiceDefine(GspMetadata vo) { + ServiceDefine serviceDefine = new ServiceDefine(); + serviceDefine.setId(UUID.randomUUID().toString()); + serviceDefine.setResourceId(vo.getHeader().getId()); + serviceDefine.setResourceType(getResourceType(resourceType)); + serviceDefine.setResourceCode(((GspViewModel) vo.getContent()).getGeneratedConfigID()); + serviceDefine.setResourceName(vo.getHeader().getName()); + serviceDefine.setOperations(new ArrayList<>()); + switch (resourceType) { + case VO_ADVANCE: + serviceDefine.getOperations().addAll(ViewModelUtils.getAllOperations(vo)); + break; + case VO_SIMPLE: + serviceDefine.getOperations().addAll(SimpleViewModelUtils.getAllOperations(vo)); + break; + default: + throw new RuntimeException("不支持的资源类型:" + resourceType); + } + return serviceDefine; + } + + private MetadataHeader buildEapiMetadataHeader(GspMetadata vo) { + MetadataHeader header = new MetadataHeader(); + header.setId(UUID.randomUUID().toString()); + header.setNameSpace(vo.getHeader().getNameSpace()); + header.setCode(vo.getHeader().getCode()); + header.setName(vo.getHeader().getName()); + header.setExtendable(vo.getHeader().isExtendable()); + if (StringUtils.isBlank(vo.getHeader().getBizobjectID())) { + throw new RuntimeException(String.format("VO元数据【%s(ID:%s)】的业务对象不能为空", vo.getHeader().getCode(), vo.getHeader().getId())); + } + header.setBizobjectID(vo.getHeader().getBizobjectID()); + header.setType(EAPI_TYPE_NAME); + + return header; + } + + private GspMetadata buildEapiMetadataBaseInfo(GspMetadata vo, String path) { + GspMetadata metadata = new GspMetadata(); + metadata.setHeader(new MetadataHeader()); + metadata.getHeader().setNameSpace(vo.getHeader().getNameSpace()); + metadata.getHeader().setCode(vo.getHeader().getCode()); + metadata.getHeader().setName(vo.getHeader().getName()); + metadata.getHeader().setExtendable(vo.getHeader().isExtendable()); + if (StringUtils.isBlank(vo.getHeader().getBizobjectID())) { + throw new RuntimeException(String.format("VO元数据【%s(ID:%s)】的业务对象不能为空", vo.getHeader().getCode(), vo.getHeader().getId())); + } + metadata.getHeader().setBizobjectID(vo.getHeader().getBizobjectID()); + metadata.getHeader().setType(EAPI_TYPE_NAME); + metadata.getHeader().setFileName(vo.getHeader().getCode() + EAPI_SUFFIX_NAME); + metadata.setRelativePath(getEapiRelativePath(path)); + + FileService fileService = SpringBeanUtils.getBean(FileService.class); + // 如果该路径上不存在api文件夹则直接创建新的api文件夹 + if (!fileService.isDirectoryExist(metadata.getRelativePath())) { + fileService.createDirectory(metadata.getRelativePath()); + } + return metadata; + } + + private String getResourceType(ResourceType resourceType) { + switch (resourceType) { + case VO_ADVANCE: + return EAPI_RESOURCE_TYPE_VO; + case VO_SIMPLE: + return EAPI_RESOURCE_TYPE_VO_SIMPLE; + default: + throw new RuntimeException("不支持的资源类型:" + resourceType); + } + } + + private String getEapiRelativePath(String path) { + MetadataProject metadataProject = MetadataUtils.getMetadataProject(path); + // 拼接eapi元数据路径:工程路径+eapi文件路径(/eapi) + return metadataProject.getProjectPath() + EAPI_PATH; + } + +} diff --git a/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/config/EapiBeanConfig.java b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/config/EapiBeanConfig.java new file mode 100644 index 0000000..c7db595 --- /dev/null +++ b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/config/EapiBeanConfig.java @@ -0,0 +1,47 @@ +/* + * Copyright © OpenAtom Foundation. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.inspur.edp.sgf.dt.provider.config; + +import com.inspur.edp.sgf.dt.provider.service.SimpleViewModelProvider; +import com.inspur.edp.sgf.dt.provider.service.ViewModelProvider; +import com.inspur.edp.sgf.dt.spi.ResourceProvider; +import io.iec.edp.caf.multicontext.annotation.BeanCollector; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 功能描述: + * + * @ClassName: EapiBeanConfig + * @Author: Fynn Qi + * @Date: 2021/1/22 9:28 + * @Version: V1.0 + */ +@Configuration(value = "com.inspur.edp.sgf.dt.provider.config.EapiBeanConfig", proxyBeanMethods = false) +public class EapiBeanConfig { + + @Bean("com.inspur.edp.sgf.dt.provider.service.ViewModelProvider") + @BeanCollector + public ResourceProvider viewModelProvider() { + return new ViewModelProvider(); + } + + @Bean("com.inspur.edp.sgf.dt.provider.service.SimpleViewModelProvider") + @BeanCollector + public ResourceProvider simpleViewModelProvider() { + return new SimpleViewModelProvider(); + } + +} diff --git a/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/SimpleViewModelProvider.java b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/SimpleViewModelProvider.java new file mode 100644 index 0000000..9352cd4 --- /dev/null +++ b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/SimpleViewModelProvider.java @@ -0,0 +1,97 @@ +/* + * Copyright © OpenAtom Foundation. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.inspur.edp.sgf.dt.provider.service; + +import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; +import com.inspur.edp.sgf.api.common.ResourceType; +import com.inspur.edp.sgf.api.common.SummaryInfo; +import com.inspur.edp.sgf.api.entity.ServiceOperation; +import com.inspur.edp.sgf.dt.provider.common.EapiBuilder; +import com.inspur.edp.sgf.dt.provider.utils.MetadataUtils; +import com.inspur.edp.sgf.dt.spi.EapiProvider; +import com.inspur.edp.sgf.dt.spi.ResourceProvider; +import com.inspur.edp.sgf.provider.vo.utils.SimpleViewModelUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 功能描述: 经典型视图对象元数据设计时定义适配器 + * + * @ClassName:SimpleViewModelProvider + * @Author: Fynn Qi + * @Date: 2020/8/31 15:29 + * @Version: V1.0 + */ +@EapiProvider(resourceType = "VO-Simple") +public class SimpleViewModelProvider implements ResourceProvider { + + @Override + public List getSummaryOperations(String resourceId) { + if (StringUtils.isBlank(resourceId)) { + throw new RuntimeException("外部服务获取服务操作概要信息的资源ID为空"); + } + List summaryInfos = new ArrayList<>(); + GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId); + summaryInfos.addAll(SimpleViewModelUtils.getAllSummaryOperations(metadata)); + return summaryInfos; + } + + @Override + public List getOperations(String resourceId) { + if (StringUtils.isBlank(resourceId)) { + throw new RuntimeException("外部服务获取服务操作的资源ID为空"); + } + List operations = new ArrayList<>(); + GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId); + operations.addAll(SimpleViewModelUtils.getAllOperations(metadata)); + return operations; + } + + @Override + public List getOperations(String resourceId, List operationIds) { + if (StringUtils.isBlank(resourceId)) { + throw new RuntimeException("外部服务获取服务操作的资源ID为空"); + } + GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId); + List operations = new ArrayList<>(); + operations.addAll(SimpleViewModelUtils.getAllOperations(metadata)); + if (operationIds == null || operationIds.size() <= 0) { + return null; + } + // 返回过滤的服务操作 + return operations.stream().filter(x -> operationIds.stream().anyMatch(id -> id.equals(x.getId()))).collect(Collectors.toList()); + } + + @Override + public GspMetadata create(GspMetadata metadata, String path) { + EapiBuilder builder = new EapiBuilder(); + return builder.buildEapi(metadata, path, ResourceType.VO_SIMPLE); + } + + @Override + public GspMetadata create(GspMetadata metadata) { + EapiBuilder builder = new EapiBuilder(); + return builder.buildEapi(metadata, ResourceType.VO_SIMPLE); + } + + @Override + public GspMetadata update(String eapiMetadataId, GspMetadata metadata) { + EapiBuilder builder = new EapiBuilder(); + return builder.updateEapi(eapiMetadataId, metadata, ResourceType.VO_SIMPLE); + } +} diff --git a/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/ViewModelProvider.java b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/ViewModelProvider.java new file mode 100644 index 0000000..a18e8f1 --- /dev/null +++ b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/ViewModelProvider.java @@ -0,0 +1,82 @@ +/* + * Copyright © OpenAtom Foundation. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.inspur.edp.sgf.dt.provider.service; + +import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; +import com.inspur.edp.sgf.api.common.ResourceType; +import com.inspur.edp.sgf.api.common.SummaryInfo; +import com.inspur.edp.sgf.api.entity.ServiceOperation; +import com.inspur.edp.sgf.dt.provider.common.EapiBuilder; +import com.inspur.edp.sgf.dt.provider.utils.MetadataUtils; +import com.inspur.edp.sgf.dt.spi.EapiProvider; +import com.inspur.edp.sgf.dt.spi.ResourceProvider; +import com.inspur.edp.sgf.provider.vo.utils.ViewModelUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 功能描述: 高级型视图对象元数据设计时定义适配器 + * + * @ClassName: ViewModelProvider + * @Author: Fynn Qi + * @Date:2020/2/3 10:21 + * @Version: V1.0 + */ +@EapiProvider(resourceType = "VO") +public class ViewModelProvider implements ResourceProvider { + + @Override + public List getSummaryOperations(String resourceId) { + GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId); + return ViewModelUtils.getAllSummaryOperations(metadata); + } + + @Override + public List getOperations(String resourceId) { + GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId); + return ViewModelUtils.getAllOperations(metadata); + } + + @Override + public List getOperations(String resourceId, List operationIds) { + GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId); + List operations = ViewModelUtils.getAllOperations(metadata); + if (operationIds == null || operationIds.size() <= 0) { + return null; + } + // 返回过滤的服务操作 + return operations.stream().filter(x -> operationIds.stream().anyMatch(id -> id.equals(x.getId()))).collect(Collectors.toList()); + } + + @Override + public GspMetadata create(GspMetadata metadata, String path) { + EapiBuilder builder = new EapiBuilder(); + return builder.buildEapi(metadata, path, ResourceType.VO_ADVANCE); + } + + @Override + public GspMetadata create(GspMetadata metadata) { + EapiBuilder builder = new EapiBuilder(); + return builder.buildEapi(metadata, ResourceType.VO_ADVANCE); + } + + @Override + public GspMetadata update(String eapiMetadataId, GspMetadata metadata) { + EapiBuilder builder = new EapiBuilder(); + return builder.updateEapi(eapiMetadataId, metadata, ResourceType.VO_ADVANCE); + } + +} diff --git a/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/utils/MetadataUtils.java b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/utils/MetadataUtils.java new file mode 100644 index 0000000..e8f4d63 --- /dev/null +++ b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/utils/MetadataUtils.java @@ -0,0 +1,102 @@ +/* + * Copyright © OpenAtom Foundation. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.inspur.edp.sgf.dt.provider.utils; + +import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; +import com.inspur.edp.lcm.metadata.api.entity.GspProject; +import com.inspur.edp.lcm.metadata.api.entity.MetadataProject; +import com.inspur.edp.lcm.metadata.api.service.GspProjectService; +import com.inspur.edp.lcm.metadata.api.service.MetadataProjectService; +import com.inspur.edp.lcm.metadata.api.service.MetadataService; +import com.inspur.edp.lcm.metadata.api.service.RefCommonService; +import io.iec.edp.caf.businessobject.api.entity.DevBasicBoInfo; +import io.iec.edp.caf.businessobject.api.service.DevBasicInfoService; +import io.iec.edp.caf.commons.utils.SpringBeanUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.Assert; + +import java.io.IOException; + +/** 功能描述: @ClassName: MetadataUtils @Author: Fynn Qi @Date: 2020/9/1 14:15 @Version: V1.0 */ +public class MetadataUtils { + + public static GspMetadata getDtVoMetadata(String resourceId) { + if (StringUtils.isBlank(resourceId)) { + throw new RuntimeException("外部服务获取解析的资源ID为空"); + } + if(resourceId.contains("##")){ + String[] temps=resourceId.split("##"); + MetadataService service = SpringBeanUtils.getBean(MetadataService.class); + return service.getRefMetadata(temps[1],temps[0]); + } + else{ + RefCommonService service = SpringBeanUtils.getBean(RefCommonService.class); + return service.getRefMetadata(resourceId); + } + } + + public static MetadataProject getMetadataProject(String path) { + MetadataProjectService service = SpringBeanUtils.getBean(MetadataProjectService.class); + if (service == null) { + throw new RuntimeException("获取MetadataProjectService Bean为空"); + } + MetadataProject projectInfo = service.getMetadataProjInfo(path); + if (projectInfo == null) { + throw new RuntimeException(String.format("根据相对路径【%s】获取元数据工程信息为空!", path)); + } + return projectInfo; + } + + public static GspProject getProjectInfo(GspMetadata metadata) { + if (StringUtils.isBlank(metadata.getRelativePath())) { + throw new RuntimeException( + String.format( + "元数据【%s(ID:%s)】的相对路径为空,无法获取工程信息!", + metadata.getHeader().getCode(), metadata.getHeader().getId())); + } + GspProjectService service = SpringBeanUtils.getBean(GspProjectService.class); + if (service == null) { + throw new RuntimeException("获取MetadataProjectService Bean为空"); + } + GspProject projectInfo = null; + try { + projectInfo = service.getGspProjectInfo(metadata.getRelativePath()); + } catch (IOException e) { + throw new RuntimeException(e); + } + if (projectInfo == null) { + throw new RuntimeException( + String.format( + "元数据【%s(ID:%s)】根据相对路径【%s】获取工程信息为空!", + metadata.getHeader().getCode(), + metadata.getHeader().getId(), + metadata.getRelativePath())); + } + return projectInfo; + } + + public static DevBasicBoInfo getDevBasicBoInfo(String bizId) { + DevBasicInfoService devBasicInfoService = SpringBeanUtils.getBean(DevBasicInfoService.class); + DevBasicBoInfo devBasicBoInfo = devBasicInfoService.getDevBasicBoInfo(bizId); + Assert.notNull(devBasicBoInfo, String.format("根据业务对象ID[%s]获取的DevBasicBoInfo为空", bizId)); + if (StringUtils.isBlank(devBasicBoInfo.getAppCode())) { + throw new RuntimeException(String.format("根据业务对象ID[%s]获取的DevBasicBoInfo为的AppCode为空", bizId)); + } + if (StringUtils.isBlank(devBasicBoInfo.getSuCode())) { + throw new RuntimeException(String.format("根据业务对象ID[%s]获取的DevBasicBoInfo为的SuCode为空", bizId)); + } + return devBasicBoInfo; + } +} diff --git a/rest-api-provider-dev/src/main/resources/META-INF/spring.factories b/rest-api-provider-dev/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..80ae747 --- /dev/null +++ b/rest-api-provider-dev/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.inspur.edp.sgf.dt.provider.config.EapiBeanConfig \ No newline at end of file -- Gitee