diff --git a/web-common/src/main/java/com/inspur/edp/web/common/io/FileUtility.java b/web-common/src/main/java/com/inspur/edp/web/common/io/FileUtility.java index c176557f3a76f18546f6152ead142db050bfa1cf..6320f2bdee323a9b166128f72d072788a11e81ae 100644 --- a/web-common/src/main/java/com/inspur/edp/web/common/io/FileUtility.java +++ b/web-common/src/main/java/com/inspur/edp/web/common/io/FileUtility.java @@ -439,14 +439,20 @@ public class FileUtility { } } + /** + * 递归创建文件目录 + * + * @param path + */ public static void createDirectory(String path) { - if (path == null || path.isEmpty()) { + if (StringUtility.isNullOrEmpty(path)) { return; } try { path = getPlatformIndependentPath(path); File file = new File(path); + // 目录不存在时触发 if (!exists(file)) { file.mkdirs(); } diff --git a/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtility.java b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtility.java index cf94d543c04929ad5fc2a86e8409b0a24936896f..e9f873dfdc0488c53c89fd3108c12e324b754116 100644 --- a/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtility.java +++ b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtility.java @@ -153,8 +153,9 @@ public final class MetadataUtility { /** * 判断指定工程路径下指定的元数据文件是否存在 + * * @param metaDataPath 对应的元数据所在工程路径 - * @param fileName 对应的元数据文件名称 + * @param fileName 对应的元数据文件名称 * @return */ public boolean isMetaDataExistsWithMetadataPathAndFileName(String metaDataPath, String fileName) { @@ -207,6 +208,20 @@ public final class MetadataUtility { metadataService.createMetadata(metadata.getRelativePath(), metadata); } + + /** + * 删除对应的元数据物理文件 + * @param metadataPath 元数据所属路径 + * @param metadataFileName 元数据对应的文件名称 + */ + public void deleteMetadataInDisk(String metadataPath, String metadataFileName) { + if (StringUtility.isNullOrEmpty(metadataFileName)) { + return; + } + MetadataService metadataService = SpringBeanUtils.getBean(MetadataService.class); + metadataService.deleteMetadata(metadataPath, metadataFileName); + } + private List getRefResourceMetadataCollection(String formMetadataId, String formMetadataPath) { List resourceMetadataHeaderCollection = getRefResourceMetadataHeaderCollection(formMetadataId, formMetadataPath); diff --git a/web-common/src/test/java/com/inspur/edp/web/common/io/FileUtilityTest.java b/web-common/src/test/java/com/inspur/edp/web/common/io/FileUtilityTest.java index 744338812bbf7f51662ae7766117e466683c94b6..469aa290b6b8bbd253b7aba6c9c55afa11be8662 100644 --- a/web-common/src/test/java/com/inspur/edp/web/common/io/FileUtilityTest.java +++ b/web-common/src/test/java/com/inspur/edp/web/common/io/FileUtilityTest.java @@ -43,6 +43,14 @@ public class FileUtilityTest { } + + @Test + public void testExists() { + File file = new File("c:/bucunzai"); + Assert.assertEquals(file.isDirectory(), true); + } + + @Test public void testSeparator() { System.out.println(FileUtility.DIRECTORY_SEPARATOR_CHAR); diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/metadata/module/Module.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/metadata/module/Module.java index 9288d95090ab2714f0c056afd8af1d0504f89950..16382b14ce56bb66c3427da71f2f2532c582fd38 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/metadata/module/Module.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/metadata/module/Module.java @@ -157,6 +157,9 @@ public class Module { private ArrayList> components; public final ArrayList> getComponents() { + if (this.components == null) { + this.components = new ArrayList<>(); + } return components; } @@ -175,10 +178,6 @@ public class Module { } - - - - private ArrayList> states; public ArrayList> getStates() { @@ -271,8 +270,6 @@ public class Module { } - - // 自定义代码 private List> sourceCodeRef; @@ -286,8 +283,7 @@ public class Module { } - - private boolean isComposedFrm; + private boolean isComposedFrm; public boolean isComposedFrm() { return isComposedFrm; @@ -308,7 +304,7 @@ public class Module { this.extraImports = extraImports; } - private boolean isMobileApprove; + private boolean isMobileApprove; public boolean isMobileApprove() { return isMobileApprove; @@ -319,7 +315,6 @@ public class Module { } - private String projectName; public String getProjectName() { @@ -330,7 +325,7 @@ public class Module { this.projectName = projectName; } - private Object declarations; + private Object declarations; public Object getDeclarations() { return declarations; @@ -341,7 +336,7 @@ public class Module { } - private HashMapcustomClass; + private HashMap customClass; public HashMap getCustomClass() { return customClass; diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataCmdManager.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataCmdManager.java new file mode 100644 index 0000000000000000000000000000000000000000..1b623939278b13d6287a45710f9b1dfb0e20cb44 --- /dev/null +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataCmdManager.java @@ -0,0 +1,191 @@ +package com.inspur.edp.web.formmetadata.replication; + +import com.inspur.edp.cdp.web.component.metadata.define.WebComponentMetadata; +import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; +import com.inspur.edp.lcm.metadata.api.entity.MetadataDto; +import com.inspur.edp.lcm.metadata.api.service.MetadataService; +import com.inspur.edp.web.command.component.metadata.CmpMethodRefering; +import com.inspur.edp.web.command.component.metadata.WebCommandsMetadata; +import com.inspur.edp.web.common.GSPException; +import com.inspur.edp.web.common.io.FileUtility; +import com.inspur.edp.web.common.metadata.MetadataUtility; +import com.inspur.edp.web.common.serialize.SerializeUtility; +import com.inspur.edp.web.formmetadata.metadata.formdom.FormDOM; +import io.iec.edp.caf.commons.utils.SpringBeanUtils; +import com.inspur.edp.lcm.metadata.api.entity.MetadataType; + +import java.io.File; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; +import java.util.regex.Pattern; + +/** + * 命令元数据拷贝 + * + * @author guozhiqi + */ +public class FormMetadataCmdManager { + public static void copy(MetadataReplicationContext context, GspMetadata sourceFormMetadata, + MetadataDto targetMetadataDescription, FormDOM replicateFormDOM) { + ArrayList> webcmdCollection = replicateFormDOM.getModule().getWebcmds(); + if (webcmdCollection != null && !webcmdCollection.isEmpty()) { + for (HashMap webcmd : webcmdCollection) { + String webcmdId = webcmd.containsKey("id") ? webcmd.get("id").toString() : ""; + GspMetadata webCmdMetadata = MetadataUtility.getInstance().getMetadataWithIdAndPath(webcmdId, sourceFormMetadata.getRelativePath()); + if (webCmdMetadata == null) { + throw new GSPException("Web_Replicate", "复制表单元数据时,获取命令构件失败。待获取命令构件ID是:" + webcmdId); + } + + WebCommandsMetadata webCommandMetadataContent = (WebCommandsMetadata) webCmdMetadata.getContent(); + // 复制自定义命令构件及关联服务构件 + if (webCommandMetadataContent != null && webCommandMetadataContent.getExtendProperty() != null && !webCommandMetadataContent.getExtendProperty().isCommon()) { + // 拷贝这个命令构件 + MetadataDto webCommandMetadataDto = new MetadataDto(); + // TODO:如何保证正确替换code和name + webCommandMetadataDto.setCode(webCmdMetadata.getHeader().getCode().replace(webCommandMetadataContent.getExtendProperty().getFormCode(), targetMetadataDescription.getCode())); + webCommandMetadataDto.setName(webCmdMetadata.getHeader().getName().replace(sourceFormMetadata.getHeader().getName(), targetMetadataDescription.getName())); + webCommandMetadataDto.setProjectName(targetMetadataDescription.getProjectName()); + webCommandMetadataDto.setRelativePath(targetMetadataDescription.getRelativePath()); + + webCmdMetadata.setExtendProperty(webCmdMetadata.getExtendProperty().replace(sourceFormMetadata.getHeader().getCode().split(Pattern.quote("_"), -1)[0], targetMetadataDescription.getCode().split(Pattern.quote("_"), -1)[0])); + + MetadataReplicationContext webCommandMetadataReplicationContext = new MetadataReplicationContext(); + webCommandMetadataReplicationContext.setSourceProjectName(context.getSourceProjectName()); + webCommandMetadataReplicationContext.setSourceMetadata(webCmdMetadata); + webCommandMetadataReplicationContext.setTargetMetadataDescription(webCommandMetadataDto); + + GspMetadata replicateWebCommandMetadata = MetadataCloneManager.cloneMetadata(webCommandMetadataReplicationContext); + MetadataUtility.getInstance().createMetadata(replicateWebCommandMetadata); + + // 更新表单内容关联webcmd + String oldWebCmdId = webcmd.get("id").toString(); + webcmd.put("id", replicateWebCommandMetadata.getHeader().getId()); + webcmd.put("name", replicateWebCommandMetadata.getHeader().getFileName()); + + // TODO: 具体化实现细节,避免性能问题 + // 更新ViewModels中关联webcmd + String viewModelCollectionStr = SerializeUtility.getInstance().serialize(replicateFormDOM.getModule().getviewmodels(), false); + viewModelCollectionStr = viewModelCollectionStr.replace(oldWebCmdId, webcmd.get("id").toString()); + ArrayList> temp = new ArrayList<>(); + replicateFormDOM.getModule().setviewmodels(SerializeUtility.getInstance().deserialize(viewModelCollectionStr, temp.getClass())); + //防止找不到Web构件 + String sourceProjectPath = context.getSourceMetadata().getRelativePath(); + //统一使用源工程路径查找 + replicateWebCommandMetadata.setRelativePath(sourceProjectPath); + // 查找自定义命令构件中使用的服务构件 + MetadataUtility.getInstance().getReferenceComponentMetadata(replicateWebCommandMetadata, FormMetadataCmdManager::UpdateWebComponentMetadata, context); + + // 保存命令元数据 + MetadataUtility.getInstance().saveMetadata(replicateWebCommandMetadata); + } + } + } + } + + private static void UpdateWebComponentMetadata(GspMetadata commandMetadata, CmpMethodRefering methodReferingItem, GspMetadata componentMetadata, Object... parameterArray) { + if (parameterArray.length != 1) { + return; + } + MetadataReplicationContext metadataReplicationContext = (MetadataReplicationContext) parameterArray[0]; + GspMetadata sourceFormMetadata = metadataReplicationContext.getSourceMetadata(); + String sourceProjectName = metadataReplicationContext.getSourceProjectName(); + MetadataDto targetMetadataDescription = metadataReplicationContext.getTargetMetadataDescription(); + + WebComponentMetadata componentMetadataContent = (WebComponentMetadata) componentMetadata.getContent(); + // 无需拷贝公共服务构件,仅拷贝自定义服务构件 + if (componentMetadataContent.isCommon()) { + return; + } + + MetadataUtility metadataUtility = MetadataUtility.getInstance(); + + // 拷贝这个服务构件 + + // 查找指定路径是否存在相同元数据,如果存在使用已有元数据,如果没有则创建一个 + + MetadataDto webComponentMetadataDto = new MetadataDto(); + // TODO:如何保证正确替换code和name + webComponentMetadataDto.setCode(componentMetadata.getHeader().getCode().replace(componentMetadataContent.getFormCode(), targetMetadataDescription.getCode())); + webComponentMetadataDto.setName(componentMetadata.getHeader().getName().replace(sourceFormMetadata.getHeader().getName(), targetMetadataDescription.getName())); + webComponentMetadataDto.setProjectName(targetMetadataDescription.getProjectName()); + webComponentMetadataDto.setRelativePath(targetMetadataDescription.getRelativePath()); + + // TODO:替换方式不准确,待优化 + componentMetadata.setExtendProperty(componentMetadata.getExtendProperty().replace(sourceFormMetadata.getHeader().getCode().split(Pattern.quote("_"), -1)[0], targetMetadataDescription.getCode().split(Pattern.quote("_"), -1)[0])); + MetadataReplicationContext componentMetadataReplicationContext = new MetadataReplicationContext(); + componentMetadataReplicationContext.setSourceMetadata(componentMetadata); + componentMetadataReplicationContext.setSourceProjectName(metadataReplicationContext.getSourceProjectName()); + componentMetadataReplicationContext.setTargetMetadataDescription(webComponentMetadataDto); + + GspMetadata replicateWebComponentMetadata = MetadataCloneManager.cloneMetadata(componentMetadataReplicationContext); + + // TODO:提取RelativePath赋值操作,这样就无需先clone元数据再执行是否存在校验 + if (!CheckIfMetadataFileExits(replicateWebComponentMetadata)) { + metadataUtility.createMetadata(replicateWebComponentMetadata); + } else { + replicateWebComponentMetadata = metadataUtility.getMetadata(replicateWebComponentMetadata.getHeader().getFileName(), replicateWebComponentMetadata.getRelativePath()); + } + + // 更新命令构件关联的服务构件 + methodReferingItem.setComponentId(replicateWebComponentMetadata.getHeader().getId()); + methodReferingItem.setComponentCode(replicateWebComponentMetadata.getHeader().getCode()); + methodReferingItem.setComponentName(replicateWebComponentMetadata.getHeader().getName()); + methodReferingItem.setComponentPath(replicateWebComponentMetadata.getRelativePath()); + + // 获取服务构件关联的文件 + String path = componentMetadataContent.getSource(); + //更新path + if (!path.equals(MetadataUtility.getInstance().getTypeScriptFileName(componentMetadata))) { + path = MetadataUtility.getInstance().getTypeScriptFileName(componentMetadata); + componentMetadataContent.setSource(path); + } + + // 拷贝服务构件关联的文件(.ts文件) + String absolutePath = MetadataUtility.getInstance().getAbsolutePath(path); + String oldFileContent = FileUtility.readAsString(absolutePath); + + // 更新服务构件 + String targetPath = path; + if (!sourceProjectName.equals(targetMetadataDescription.getProjectName())) { + targetPath = targetPath.replace(sourceProjectName, targetMetadataDescription.getProjectName()); + } + + String updateAbsolutPath = MetadataUtility.getInstance().getAbsolutePath(targetPath); + updateAbsolutPath = updateAbsolutPath.replace(componentMetadata.getHeader().getCode(), replicateWebComponentMetadata.getHeader().getCode()); + + File file = new File(updateAbsolutPath); + String filePath = file.getParent(); + String fileName = file.getName(); + + FileUtility.writeFile(filePath, fileName, oldFileContent); + + // 更新服务构件 + WebComponentMetadata replicateComponentMetadataContent = (WebComponentMetadata) replicateWebComponentMetadata.getContent(); + replicateComponentMetadataContent.setSource(targetPath); + + metadataUtility.saveMetadata(replicateWebComponentMetadata); + } + + private static boolean CheckIfMetadataFileExits(GspMetadata metadata) { + MetadataUtility metadataUtility = MetadataUtility.getInstance(); + + String absolutePath = metadataUtility.getAbsolutePath(metadata.getRelativePath()); + //元数据名称 + String metadataName = GetMetadataFullName(metadata); + + //元数据完整路径 + String fullPath = Paths.get(absolutePath).resolve(metadataName).toString(); + return FileUtility.exists(fullPath); + } + + private static String GetMetadataFullName(GspMetadata metadata) { + MetadataService ser = SpringBeanUtils.getBean(MetadataService.class); + List metadataTypeList = ser.getMetadataTypeList(); + Optional first = metadataTypeList.stream().filter((type) -> type.getTypeCode().equals(metadata.getHeader().getType())).findFirst(); + return metadata.getHeader().getCode() + first.get().getPostfix(); + } + +} diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataReplicator.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataReplicator.java index 93c18ef9680c3db236df8cd8f0c15ed35c1ef5f6..7a06138d3c6f87ec9f442ce6698bc5d7d71af54c 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataReplicator.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataReplicator.java @@ -1,33 +1,16 @@ package com.inspur.edp.web.formmetadata.replication; -import com.inspur.edp.cdp.web.component.metadata.define.WebComponentMetadata; import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; import com.inspur.edp.lcm.metadata.api.entity.MetadataDto; -import com.inspur.edp.lcm.metadata.api.entity.MetadataType; -import com.inspur.edp.lcm.metadata.api.service.MetadataService; -import com.inspur.edp.web.command.component.metadata.CmpMethodRefering; -import com.inspur.edp.web.command.component.metadata.WebCommandsMetadata; -import com.inspur.edp.web.common.GSPException; import com.inspur.edp.web.common.entity.ResultCode; import com.inspur.edp.web.common.entity.ResultMessage; import com.inspur.edp.web.common.io.FileUtility; import com.inspur.edp.web.common.logger.WebLogger; import com.inspur.edp.web.common.metadata.MetadataUtility; -import com.inspur.edp.web.common.serialize.SerializeUtility; -import com.inspur.edp.web.common.utility.StringUtility; import com.inspur.edp.web.formmetadata.metadata.FormMetadataContent; import com.inspur.edp.web.formmetadata.metadata.FormMetadataContentService; import com.inspur.edp.web.formmetadata.metadata.formdom.FormDOM; -import io.iec.edp.caf.commons.utils.SpringBeanUtils; - -import java.io.File; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Optional; -import java.util.regex.Pattern; /** * 表单元数据复制器 @@ -69,216 +52,57 @@ public class FormMetadataReplicator { GspMetadata sourceFormMetadata = context.getSourceMetadata(); MetadataDto targetMetadataDescription = context.getTargetMetadataDescription(); - - // 复制表单元数据 - GspMetadata replicateFormMetadata = MetadataCloneManager.cloneMetadata(context); - - //执行复制前参数必要验证 - MetaDataReplicateBeforeValidator beforeValidator = new MetaDataReplicateBeforeValidator(); - ResultMessage validateResult = beforeValidator.validate(replicateFormMetadata); - if (!validateResult.isSuccess()) { - return validateResult; - } - - // 元数据创建前处理 - // 如果待保存元数据所在文件夹不存在,则创建文件夹 - String replicateFormMetadataAbsolutePath = MetadataUtility.getInstance().getAbsolutePath(replicateFormMetadata.getRelativePath()); - if (!FileUtility.exists(replicateFormMetadataAbsolutePath)) { - FileUtility.createDirectory(replicateFormMetadataAbsolutePath); - } - - // 磁盘中创建表单元数据 - MetadataUtility.getInstance().createMetadata(replicateFormMetadata); - - // 更新replicateFormMetadataContent - FormMetadataContent replicateFormMetadataContent = (FormMetadataContent) replicateFormMetadata.getContent(); - FormDOM replicateFormDOM = FormMetadataContentService.getInstance().getFormContent(replicateFormMetadataContent); - - // 1. 拷贝VO元数据及关联元数据 - FormMetadataVoManager.copyFormMetadataVo(context, sourceFormMetadata, targetMetadataDescription, replicateFormDOM, IsDebug); - - // 2. 表单关联状态机(从表单中获取stateMachineId) - FormMetadataSmManager.copyFormMetadataStateMachine(context, sourceFormMetadata, targetMetadataDescription, replicateFormDOM, IsDebug); - - // 3. 表单关联命令构件及服务构件 - copyFormMetadataCmd(context, sourceFormMetadata, targetMetadataDescription, replicateFormDOM); - - // 更新 Form Content - FormMetadataContentService.getInstance().setFormContent(replicateFormMetadataContent, replicateFormDOM); - - // 前置条件:保存前,对应的元数据文件已存在 - MetadataUtility.getInstance().saveMetadata(replicateFormMetadata); - - return ResultCode.success(); - } - - private void copyFormMetadataCmd(MetadataReplicationContext metadataReplicationContext, GspMetadata sourceFormMetadata, MetadataDto targetMetadataDescription, FormDOM replicateFormDOM) { - ArrayList> webcmdCollection = replicateFormDOM.getModule().getWebcmds(); - if (webcmdCollection != null && !webcmdCollection.isEmpty()) { - for (HashMap webcmd : webcmdCollection) { - String webcmdId = webcmd.containsKey("id") ? webcmd.get("id").toString() : ""; - GspMetadata webCmdMetadata = MetadataUtility.getInstance().getMetadataWithIdAndPath(webcmdId, sourceFormMetadata.getRelativePath()); - if (webCmdMetadata == null) { - throw new GSPException("Web_Replicate", "复制表单元数据时,获取命令构件失败。待获取命令构件ID是:" + webcmdId); - } - - WebCommandsMetadata webCommandMetadataContent = (WebCommandsMetadata) webCmdMetadata.getContent(); - // 复制自定义命令构件及关联服务构件 - if (webCommandMetadataContent != null && webCommandMetadataContent.getExtendProperty() != null && !webCommandMetadataContent.getExtendProperty().isCommon()) { - // 拷贝这个命令构件 - MetadataDto webCommandMetadataDto = new MetadataDto(); - // TODO:如何保证正确替换code和name - webCommandMetadataDto.setCode(webCmdMetadata.getHeader().getCode().replace(webCommandMetadataContent.getExtendProperty().getFormCode(), targetMetadataDescription.getCode())); - webCommandMetadataDto.setName(webCmdMetadata.getHeader().getName().replace(sourceFormMetadata.getHeader().getName(), targetMetadataDescription.getName())); - webCommandMetadataDto.setProjectName(targetMetadataDescription.getProjectName()); - webCommandMetadataDto.setRelativePath(targetMetadataDescription.getRelativePath()); - - webCmdMetadata.setExtendProperty(webCmdMetadata.getExtendProperty().replace(sourceFormMetadata.getHeader().getCode().split(Pattern.quote("_"), -1)[0], targetMetadataDescription.getCode().split(Pattern.quote("_"), -1)[0])); - - MetadataReplicationContext webCommandMetadataReplicationContext = new MetadataReplicationContext(); - webCommandMetadataReplicationContext.setSourceProjectName(metadataReplicationContext.getSourceProjectName()); - webCommandMetadataReplicationContext.setSourceMetadata(webCmdMetadata); - webCommandMetadataReplicationContext.setTargetMetadataDescription(webCommandMetadataDto); - - GspMetadata replicateWebCommandMetadata = MetadataCloneManager.cloneMetadata(webCommandMetadataReplicationContext); - MetadataUtility.getInstance().createMetadata(replicateWebCommandMetadata); - - // 更新表单内容关联webcmd - String oldWebCmdId = webcmd.get("id").toString(); - webcmd.put("id", replicateWebCommandMetadata.getHeader().getId()); - webcmd.put("name", replicateWebCommandMetadata.getHeader().getFileName()); - - // TODO: 具体化实现细节,避免性能问题 - // 更新ViewModels中关联webcmd - String viewModelCollectionStr = SerializeUtility.getInstance().serialize(replicateFormDOM.getModule().getviewmodels(), false); - viewModelCollectionStr = viewModelCollectionStr.replace(oldWebCmdId, webcmd.get("id").toString()); - ArrayList> temp = new ArrayList<>(); - replicateFormDOM.getModule().setviewmodels(SerializeUtility.getInstance().deserialize(viewModelCollectionStr, temp.getClass())); - //防止找不到Web构件 - String sourceProjectPath = metadataReplicationContext.getSourceMetadata().getRelativePath(); - //统一使用源工程路径查找 - replicateWebCommandMetadata.setRelativePath(sourceProjectPath); - // 查找自定义命令构件中使用的服务构件 - MetadataUtility.getInstance().getReferenceComponentMetadata(replicateWebCommandMetadata, this::UpdateWebComponentMetadata, metadataReplicationContext); - - // 保存命令元数据 - MetadataUtility.getInstance().saveMetadata(replicateWebCommandMetadata); - } + GspMetadata replicateFormMetadata = null; + try { + // 复制表单元数据 + replicateFormMetadata = MetadataCloneManager.cloneMetadata(context); + + //执行复制前参数必要验证 + MetaDataReplicateBeforeValidator beforeValidator = new MetaDataReplicateBeforeValidator(); + ResultMessage validateResult = beforeValidator.validate(replicateFormMetadata); + if (!validateResult.isSuccess()) { + return validateResult; } - } - } - - - private void UpdateWebComponentMetadata(GspMetadata commandMetadata, CmpMethodRefering methodReferingItem, GspMetadata componentMetadata, Object... parameterArray) { - if (parameterArray.length != 1) { - return; - } - MetadataReplicationContext metadataReplicationContext = (MetadataReplicationContext) parameterArray[0]; - GspMetadata sourceFormMetadata = metadataReplicationContext.getSourceMetadata(); - String sourceProjectName = metadataReplicationContext.getSourceProjectName(); - MetadataDto targetMetadataDescription = metadataReplicationContext.getTargetMetadataDescription(); - - WebComponentMetadata componentMetadataContent = (WebComponentMetadata) componentMetadata.getContent(); - // 无需拷贝公共服务构件,仅拷贝自定义服务构件 - if (componentMetadataContent.isCommon()) { - return; - } - - MetadataUtility metadataUtility = MetadataUtility.getInstance(); - // 拷贝这个服务构件 - - // 查找指定路径是否存在相同元数据,如果存在使用已有元数据,如果没有则创建一个 - - MetadataDto webComponentMetadataDto = new MetadataDto(); - // TODO:如何保证正确替换code和name - webComponentMetadataDto.setCode(componentMetadata.getHeader().getCode().replace(componentMetadataContent.getFormCode(), targetMetadataDescription.getCode())); - webComponentMetadataDto.setName(componentMetadata.getHeader().getName().replace(sourceFormMetadata.getHeader().getName(), targetMetadataDescription.getName())); - webComponentMetadataDto.setProjectName(targetMetadataDescription.getProjectName()); - webComponentMetadataDto.setRelativePath(targetMetadataDescription.getRelativePath()); + // 元数据创建前处理 + // 如果待保存元数据所在文件夹不存在,则创建文件夹 + String replicateFormMetadataAbsolutePath = MetadataUtility.getInstance().getAbsolutePath(replicateFormMetadata.getRelativePath()); + if (!FileUtility.exists(replicateFormMetadataAbsolutePath)) { + FileUtility.createDirectory(replicateFormMetadataAbsolutePath); + } - // TODO:替换方式不准确,待优化 - componentMetadata.setExtendProperty(componentMetadata.getExtendProperty().replace(sourceFormMetadata.getHeader().getCode().split(Pattern.quote("_"), -1)[0], targetMetadataDescription.getCode().split(Pattern.quote("_"), -1)[0])); - MetadataReplicationContext componentMetadataReplicationContext = new MetadataReplicationContext(); - componentMetadataReplicationContext.setSourceMetadata(componentMetadata); - componentMetadataReplicationContext.setSourceProjectName(metadataReplicationContext.getSourceProjectName()); - componentMetadataReplicationContext.setTargetMetadataDescription(webComponentMetadataDto); + // 磁盘中创建表单元数据 + MetadataUtility.getInstance().createMetadata(replicateFormMetadata); - GspMetadata replicateWebComponentMetadata = MetadataCloneManager.cloneMetadata(componentMetadataReplicationContext); + // 更新replicateFormMetadataContent + FormMetadataContent replicateFormMetadataContent = (FormMetadataContent) replicateFormMetadata.getContent(); + FormDOM replicateFormDOM = FormMetadataContentService.getInstance().getFormContent(replicateFormMetadataContent); - // TODO:提取RelativePath赋值操作,这样就无需先clone元数据再执行是否存在校验 - if (!CheckIfMetadataFileExits(replicateWebComponentMetadata)) { - metadataUtility.createMetadata(replicateWebComponentMetadata); - } else { - replicateWebComponentMetadata = metadataUtility.getMetadata(replicateWebComponentMetadata.getHeader().getFileName(), replicateWebComponentMetadata.getRelativePath()); - } + // 1. 拷贝VO元数据及关联元数据 + FormMetadataVoManager.copyFormMetadataVo(context, sourceFormMetadata, targetMetadataDescription, replicateFormDOM, IsDebug); - // 更新命令构件关联的服务构件 - if (IsDebug) { - System.out.println("replicateWebComponentMetadataId: " + replicateWebComponentMetadata.getHeader().getId()); - } - methodReferingItem.setComponentId(replicateWebComponentMetadata.getHeader().getId()); - methodReferingItem.setComponentCode(replicateWebComponentMetadata.getHeader().getCode()); - methodReferingItem.setComponentName(replicateWebComponentMetadata.getHeader().getName()); - methodReferingItem.setComponentPath(replicateWebComponentMetadata.getRelativePath()); + // 2. 表单关联状态机(从表单中获取stateMachineId) + FormMetadataSmManager.copyFormMetadataStateMachine(context, sourceFormMetadata, targetMetadataDescription, replicateFormDOM, IsDebug); - // 获取服务构件关联的文件 - String path = componentMetadataContent.getSource(); - //更新path - if (!path.equals(MetadataUtility.getInstance().getTypeScriptFileName(componentMetadata))) { - path = MetadataUtility.getInstance().getTypeScriptFileName(componentMetadata); - componentMetadataContent.setSource(path); - } + // 3. 表单关联命令构件及服务构件 + FormMetadataCmdManager.copy(context, sourceFormMetadata, targetMetadataDescription, replicateFormDOM); - // 拷贝服务构件关联的文件(.ts文件) - String absolutePath = MetadataUtility.getInstance().getAbsolutePath(path); - String oldFileContent = FileUtility.readAsString(absolutePath); + // 更新 Form Content + FormMetadataContentService.getInstance().setFormContent(replicateFormMetadataContent, replicateFormDOM); - // 更新服务构件 - String targetPath = path; - if (!sourceProjectName.equals(targetMetadataDescription.getProjectName())) { - targetPath = targetPath.replace(sourceProjectName, targetMetadataDescription.getProjectName()); - } + // 前置条件:保存前,对应的元数据文件已存在 + MetadataUtility.getInstance().saveMetadata(replicateFormMetadata); + } catch (RuntimeException ex) { + WebLogger.Instance.error("表单复制出现错误," + ex.getMessage() + ex.getStackTrace()); + // 执行元数据的清理工作 此处仅删除表单元数据 因此存在表单元数据级联删除动作 + if (replicateFormMetadata != null) { + MetadataUtility.getInstance().deleteMetadataInDisk(replicateFormMetadata.getRelativePath(), replicateFormMetadata.getHeader().getFileName()); + } - String updateAbsolutPath = MetadataUtility.getInstance().getAbsolutePath(targetPath); - updateAbsolutPath = updateAbsolutPath.replace(componentMetadata.getHeader().getCode(), replicateWebComponentMetadata.getHeader().getCode()); - if (IsDebug) { - System.out.println(".ts file Path is: " + updateAbsolutPath); - } - File file = new File(updateAbsolutPath); - String filePath = file.getParent(); - String fileName = file.getName(); - if (IsDebug) { - System.out.println("file Path is: " + filePath); - System.out.println("file Name is: " + fileName); + throw new RuntimeException(ex); } - FileUtility.writeFile(filePath, fileName, oldFileContent); - - // 更新服务构件 - WebComponentMetadata replicateComponentMetadataContent = (WebComponentMetadata) replicateWebComponentMetadata.getContent(); - replicateComponentMetadataContent.setSource(targetPath); - - metadataUtility.saveMetadata(replicateWebComponentMetadata); - } - private boolean CheckIfMetadataFileExits(GspMetadata metadata) { - MetadataUtility metadataUtility = MetadataUtility.getInstance(); - - String absolutePath = metadataUtility.getAbsolutePath(metadata.getRelativePath()); - //元数据名称 - String metadataName = GetMetadataFullName(metadata); - - //元数据完整路径 - String fullPath = Paths.get(absolutePath).resolve(metadataName).toString(); - return FileUtility.exists(fullPath); - } - - private String GetMetadataFullName(GspMetadata metadata) { - MetadataService ser = SpringBeanUtils.getBean(MetadataService.class); - List metadataTypeList = ser.getMetadataTypeList(); - Optional first = metadataTypeList.stream().filter((type) -> type.getTypeCode().equals(metadata.getHeader().getType())).findFirst(); - return metadata.getHeader().getCode() + first.get().getPostfix(); + return ResultCode.success(); } - } diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataSmManager.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataSmManager.java index 2b82769e91741ea125f9c49d56992b7faa2e0635..dcfe97b418c20375966f6d9d41189beb8cd9ed0c 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataSmManager.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataSmManager.java @@ -3,6 +3,7 @@ package com.inspur.edp.web.formmetadata.replication; import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; import com.inspur.edp.lcm.metadata.api.entity.MetadataDto; import com.inspur.edp.web.common.metadata.MetadataUtility; +import com.inspur.edp.web.common.utility.StringUtility; import com.inspur.edp.web.formmetadata.metadata.formdom.FormDOM; import java.util.ArrayList; @@ -14,15 +15,17 @@ import java.util.HashMap; * @author Noah Guo * @date 2021/02/26 */ - class FormMetadataSmManager { +class FormMetadataSmManager { public static void copyFormMetadataStateMachine(MetadataReplicationContext metadataReplicationContext, GspMetadata sourceFormMetadata, - MetadataDto targetMetadataDescription, FormDOM replicateFormDOM,boolean IsDebug) { + MetadataDto targetMetadataDescription, FormDOM replicateFormDOM, boolean IsDebug) { ArrayList> stateMachineCollection = replicateFormDOM.getModule().getStateMachines(); if (stateMachineCollection != null && !stateMachineCollection.isEmpty()) { for (HashMap stateMachine : stateMachineCollection) { String stateMachineId = stateMachine.containsKey("uri") ? stateMachine.get("uri").toString() : ""; - - GspMetadata stateMachineMetadata = MetadataUtility.getInstance().getMetadataWithIdAndPath(stateMachineId,sourceFormMetadata.getRelativePath()); + if (StringUtility.isNullOrEmpty(stateMachineId)) { + continue; + } + GspMetadata stateMachineMetadata = MetadataUtility.getInstance().getMetadataWithIdAndPath(stateMachineId, sourceFormMetadata.getRelativePath()); MetadataDto stateMachineMetadataDto = new MetadataDto(); stateMachineMetadataDto.setCode(stateMachineMetadata.getHeader().getCode().replace(sourceFormMetadata.getHeader().getCode(), targetMetadataDescription.getCode())); stateMachineMetadataDto.setName(stateMachineMetadata.getHeader().getName().replace(sourceFormMetadata.getHeader().getName(), targetMetadataDescription.getName())); diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataVoManager.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataVoManager.java index 5aa2bbf9df3b6c14ff36b7169e8b7c9b78a5001e..8e246b00f1fa0a83ba358c064636ab1a631ceede 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataVoManager.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/FormMetadataVoManager.java @@ -6,6 +6,7 @@ import com.inspur.edp.sgf.api.common.ResourceType; import com.inspur.edp.sgf.api.entity.SgMetadata; import com.inspur.edp.sgf.api.service.EapiMetadataDtService; import com.inspur.edp.web.common.metadata.MetadataUtility; +import com.inspur.edp.web.common.utility.StringUtility; import com.inspur.edp.web.formmetadata.metadata.formdom.FormDOM; import io.iec.edp.caf.commons.utils.SpringBeanUtils; @@ -18,15 +19,22 @@ import java.util.HashMap; * @author Noah Guo * @date 2021/02/26 */ - class FormMetadataVoManager { - public static void copyFormMetadataVo(MetadataReplicationContext metadataReplicationContext, GspMetadata sourceFormMetadata, +class FormMetadataVoManager { + public static void copyFormMetadataVo(MetadataReplicationContext context, GspMetadata sourceFormMetadata, MetadataDto targetMetadataDescription, FormDOM replicateFormDOM, boolean isDebug) { ArrayList> schemaCollection = replicateFormDOM.getModule().getSchemas(); if (schemaCollection != null && !schemaCollection.isEmpty()) { for (HashMap schema : schemaCollection) { // 1.1 获取并拷贝VO String viewObjectId = schema.containsKey("id") ? schema.get("id").toString() : ""; + if (StringUtility.isNullOrEmpty(viewObjectId)) { + // 如果不存在对应的voId 那么无法进行vo拷贝 + continue; + } GspMetadata viewObjectMetadata = MetadataUtility.getInstance().getMetadataWithIdAndPath(viewObjectId, sourceFormMetadata.getRelativePath()); + if (viewObjectMetadata == null) { + throw new RuntimeException("根据VoId获取对应元数据为空,对应voId为:" + viewObjectId); + } MetadataDto viewObjectMetadataDto = new MetadataDto(); viewObjectMetadataDto.setCode(viewObjectMetadata.getHeader().getCode().replace(sourceFormMetadata.getHeader().getCode(), targetMetadataDescription.getCode())); viewObjectMetadataDto.setName(viewObjectMetadata.getHeader().getName().replace(sourceFormMetadata.getHeader().getName(), targetMetadataDescription.getName())); @@ -34,10 +42,11 @@ import java.util.HashMap; viewObjectMetadataDto.setRelativePath(targetMetadataDescription.getRelativePath()); MetadataReplicationContext viewObjectMetadataReplicationContext = new MetadataReplicationContext(); - viewObjectMetadataReplicationContext.setSourceProjectName(metadataReplicationContext.getSourceProjectName()); + viewObjectMetadataReplicationContext.setSourceProjectName(context.getSourceProjectName()); viewObjectMetadataReplicationContext.setSourceMetadata(viewObjectMetadata); viewObjectMetadataReplicationContext.setTargetMetadataDescription(viewObjectMetadataDto); + // 复制vo元数据 GspMetadata replicateViewObjectMetadata = MetadataCloneManager.cloneMetadata(viewObjectMetadataReplicationContext); MetadataUtility.getInstance().createMetadata(replicateViewObjectMetadata); diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/MetaDataReplicateBeforeValidator.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/MetaDataReplicateBeforeValidator.java index 21c1299e9ce20d1dba6903359ffc41968cd65837..e81be8f032cc693dd3543c29db4a4172a77b1d2b 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/MetaDataReplicateBeforeValidator.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/MetaDataReplicateBeforeValidator.java @@ -4,6 +4,7 @@ import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; import com.inspur.edp.web.common.entity.ResultCode; import com.inspur.edp.web.common.entity.ResultMessage; import com.inspur.edp.web.common.metadata.MetadataUtility; +import com.inspur.edp.web.formmetadata.metadata.FormMetadataContent; /** * 元数据拷贝前参数及必要条件验证 @@ -25,6 +26,18 @@ class MetaDataReplicateBeforeValidator { resultMessage = ResultCode.info("目标元数据存在,无法进行复制。对应目标元数据名称:" + targetMetaData.getHeader().getFileName() + ",所属工程路径:" + targetMetaData.getRelativePath()); return resultMessage; } + + // 表单元数据内容不能为空 + if (targetMetaData.getContent() == null) { + resultMessage = ResultCode.info("待复制表单元数据内容为空"); + return resultMessage; + } + // 待复制的必须为表单元数据 + if (!(targetMetaData.getContent() instanceof FormMetadataContent)) { + resultMessage = ResultCode.info("仅支持表单元数据复制"); + return resultMessage; + } + return ResultCode.success(); } } diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/adjust/FormMetadataCloneAdjustStrategy.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/adjust/FormMetadataCloneAdjustStrategy.java index 94453c5e6be695cd880d7d955ac25b5cd7e8474d..6fb81222b33a74364c09a5477ff4f8065e8f0145 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/adjust/FormMetadataCloneAdjustStrategy.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/replication/adjust/FormMetadataCloneAdjustStrategy.java @@ -8,6 +8,10 @@ import com.inspur.edp.web.formmetadata.metadata.FormMetadataContent; import com.inspur.edp.web.formmetadata.metadata.FormMetadataContentService; import com.inspur.edp.web.formmetadata.metadata.formdom.FormDOM; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + /** * 表单元数据拷贝 数据调整 */ @@ -27,7 +31,38 @@ class FormMetadataCloneAdjustStrategy implements GspMetadataCloneAdjustStrategy formDOM.getModule().setName(replicateMetadata.getHeader().getName()); formDOM.getModule().setCaption(replicateMetadata.getHeader().getName()); formDOM.getModule().setCreationDate(CommonUtility.getCurrentDateString()); + // 如果存在筛选方案 那么需要将筛选方案的formId调整为当前的表单code + for (HashMap item : formDOM.getModule().getComponents()) { + this.rescure(item, formDOM); + } + + //更新工程名 FormMetadataContentService.getInstance().setFormContent(replicateFormMetadataContent, formDOM); } + + + /** + * 递归进行查找筛选方案 并进行参数调整 + * + * @param currentComponent + * @param formDOM + */ + private void rescure(HashMap currentComponent, FormDOM formDOM) { + if (currentComponent != null) { + // 如果是筛选方案 当前仅处理筛选方案 + if (Objects.equals(currentComponent.get("type"), "QueryScheme")) { + currentComponent.put("formId", formDOM.getModule().getCode()); + } + // 如果包含子 那么需要递归进行查找 + if (currentComponent.get("contents") != null && (currentComponent.get("contents") instanceof List)) { + List> contentList = (List) currentComponent.get("contents"); + for (HashMap item : contentList) { + this.rescure(item, formDOM); + } + } + } + } + + } diff --git a/web-form-metadata/src/test/java/com/inspur/edp/web/formmetadata/replication/FormMetadataReplicatorTest.java b/web-form-metadata/src/test/java/com/inspur/edp/web/formmetadata/replication/FormMetadataReplicatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..4a9fc368d0d7eecb5411da1cbd960d30b6015474 --- /dev/null +++ b/web-form-metadata/src/test/java/com/inspur/edp/web/formmetadata/replication/FormMetadataReplicatorTest.java @@ -0,0 +1,36 @@ +package com.inspur.edp.web.formmetadata.replication; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class FormMetadataReplicatorTest { + private String source = "noah"; + + + @Test + public void test() { + try { + String source=""; + this.testException(); + } catch (Exception ex) { + source=""; + System.out.println("出现了异常 " + ex.getMessage()); + } + + System.out.println("当前的值为 " + source); + + } + + public void testException() { + try { + source = "noah try"; + int ii = 4 / 0; + } catch (Exception ex) { + source = "noah catch"; + throw new RuntimeException(ex); + } finally { + source = "noah finally"; + } + } +} \ No newline at end of file