diff --git a/dynamicform/web-dynamic-form-core/pom.xml b/dynamicform/web-dynamic-form-core/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d0f08f7dbb122fa7c59091985b835fa0ef6769fc
--- /dev/null
+++ b/dynamicform/web-dynamic-form-core/pom.xml
@@ -0,0 +1,30 @@
+
+
+
+
+ 4.0.0
+
+ com.inspur.edp
+ web
+ 0.1.9-SNAPSHOT
+
+
+ web-dynamic-form-core
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index cf939a15f3d74e12d6e8b46fa18196f334647920..f58dd384093ddabca593fdf3f491e5534bec1225 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,6 +47,8 @@
web-npmpackage-core
web-npmpackage-api
web-npmpackage-patch
+ web-dynamic-form-api
+ web-dynamic-form-core
@@ -66,8 +68,29 @@
1.8
1.8
1.8
+ UTF-8
-
+
+
+ noah-guozhiqi
+ guozhiqi21@163.com
+
+
+
+
+ Apache License, Version 2.0
+ http://www.apache.org/licenses/LICENSE-2.0
+ repo
+
+
+
+ Inspur Group
+ https://gitee.com/ubml/ui-model
+
+
+ gitee
+ https://gitee.com/ubml/ui-model/issues
+
@@ -272,6 +295,18 @@
${custom.version}
compile
+
+ com.inspur.edp
+ web-dynamicform-api
+ ${custom.version}
+ compile
+
+
+ com.inspur.edp
+ web-dynamicform-core
+ ${custom.version}
+ compile
+
org.junit.jupiter
junit-jupiter-api
@@ -308,6 +343,7 @@
com.inspur.edp
formserver-viewmodel
0.2.15
+ compile
com.inspur.edp
@@ -506,11 +542,6 @@
0.1.1
compile
-
- com.inspur.edp
- lcm-metadata-spi
- 0.1.37
-
diff --git a/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/buildparametergenerator/JitBuildParameterGenerator.java b/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/buildparametergenerator/JitBuildParameterGenerator.java
index bc18fdf89fbc302b5b5c7efaa5c1e16106a49045..b2d3432434fe1e5b47dd4c3311f007c48c8b01b2 100644
--- a/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/buildparametergenerator/JitBuildParameterGenerator.java
+++ b/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/buildparametergenerator/JitBuildParameterGenerator.java
@@ -39,10 +39,6 @@ public class JitBuildParameterGenerator {
String currentWorkPath = FileUtility.getCurrentWorkPath(buildParameter.isInUpgradeTool());
- if (buildParameter.isInUpgradeTool()) {
- System.out.println("web: current work path is " + currentWorkPath);
- }
-
// 如果未设定编译路径 那么设定当前程序运行环境所在根目录
if (StringUtility.isNullOrEmpty(buildParameter.getBuildProjectPath())) {
// 工当前运行环境目录下增加runtimeprojects 文件目录
diff --git a/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/formjsonfilegenerator/FrmJsonFileGenerator.java b/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/formjsonfilegenerator/FrmJsonFileGenerator.java
index cfb83e7bb80799a6d0ecdbb0c4bcc5d5e9271bc9..723b7389b6aed16157fe191ea0744332d4710ea7 100644
--- a/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/formjsonfilegenerator/FrmJsonFileGenerator.java
+++ b/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/formjsonfilegenerator/FrmJsonFileGenerator.java
@@ -22,6 +22,8 @@ import com.inspur.edp.lcm.metadata.api.entity.*;
import com.inspur.edp.web.common.environment.ExecuteEnvironment;
import com.inspur.edp.web.common.io.FileUtility;
import com.inspur.edp.web.common.logger.WebLogger;
+import com.inspur.edp.web.common.metadata.MetadataGetterParameter;
+import com.inspur.edp.web.common.metadata.MetadataTypeEnum;
import com.inspur.edp.web.common.metadata.MetadataUtility;
import com.inspur.edp.web.common.serialize.SerializeUtility;
import com.inspur.edp.web.common.utility.StringUtility;
@@ -131,7 +133,12 @@ public class FrmJsonFileGenerator extends AbstractFormJsonFileGenerator implemen
List resourceList = new ArrayList<>();
refList.forEach(MetadataReference -> {
if (MetadataReference.getDependentMetadata().getType().equals("ResourceMetadata")) {
- GspMetadata refMetadata = MetadataUtility.getInstance().getMetadataWithEnvironment(MetadataReference.getDependentMetadata().getId(), this.getExecuteEnvironment(), this.isUpdradeTool());
+ GspMetadata refMetadata = MetadataUtility.getInstance().getMetadataWithEnvironment(() -> {
+ MetadataGetterParameter.GetterMetadataInfo getterMetadataInfo = new MetadataGetterParameter.GetterMetadataInfo();
+ getterMetadataInfo.setId(MetadataReference.getDependentMetadata().getId());
+ getterMetadataInfo.setMetadataType(MetadataTypeEnum.Resource);
+ return getterMetadataInfo;
+ }, null, this.getExecuteEnvironment(), this.isUpdradeTool());
ResourceMetadata resourceMetadata = (refMetadata == null || refMetadata.getContent() == null) ? null : ((ResourceMetadata) refMetadata.getContent());
I18nResource item = ConvertToI18nResource(resourceMetadata, resourceMetadata.getOriginalLanguage());
resourceList.add(item);
@@ -242,7 +249,18 @@ public class FrmJsonFileGenerator extends AbstractFormJsonFileGenerator implemen
/// 表单service文件路径
String externalFormServicePath = FileUtility.combine(formServicePath, json.getModule().getCode().toLowerCase(), "externalcomponents", externalVisualDom.getExternalComponentPath());
String metaFileName = externalVisualDom.getJson().getModule().getCode() + ".frm";
- GspMetadata formMetadata = MetadataUtility.getInstance().getMetadataWithEnvironment(externalVisualDom.getExternalComponentUri(), this.getExecuteEnvironment(), this.isUpdradeTool());
+ GspMetadata formMetadata = MetadataUtility.getInstance().getMetadataWithEnvironment(() -> {
+ MetadataGetterParameter.GetterMetadataInfo getterMetadataInfo = new MetadataGetterParameter.GetterMetadataInfo();
+ getterMetadataInfo.setId(externalVisualDom.getExternalComponentUri());
+ getterMetadataInfo.setMetadataType(MetadataTypeEnum.Frm);
+ return getterMetadataInfo;
+ }, () -> {
+ MetadataGetterParameter.GetterMetadataInfo getterMetadataInfo = new MetadataGetterParameter.GetterMetadataInfo();
+ getterMetadataInfo.setMetadataType(MetadataTypeEnum.Frm);
+ getterMetadataInfo.setCode(json.getModule().getCode());
+ getterMetadataInfo.setName(json.getModule().getName());
+ return getterMetadataInfo;
+ }, this.getExecuteEnvironment(), this.isUpdradeTool());
String[] params = {externalVisualDom.getExternalComponentPath(), externalVisualDom.getJson().getModule().getCode()};
@@ -288,7 +306,7 @@ public class FrmJsonFileGenerator extends AbstractFormJsonFileGenerator implemen
//
// // Step 4: Resolve eapi
EapiAnalysis eapiAnalysis = new EapiAnalysis(this.getExecuteEnvironment(), this.isUpdradeTool());
- eapiAnalysis.resolveEapi(formDom, formMetadataName, targetStorageBasePath, projectPath, webDevPath);
+ eapiAnalysis.resolveEapi(formDom, formMetadataName, targetStorageBasePath, projectPath, webDevPath, formMetadata.getHeader().getNameSpace());
//
// // Step 5: Resolve command service
CommandServiceAnalysis.resolveCommandService(formDom, relativePath, formServiceBasePath, webDevPath, this.getExecuteEnvironment(), this.isUpdradeTool());
diff --git a/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/formjsonfilegenerator/JsonFileGeneratorFactory.java b/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/formjsonfilegenerator/JsonFileGeneratorFactory.java
index 53ee50fa0c5c5e89d73aa61aec2cca278562c3ff..5ab428ba0587b8498534d9bc8a0b274a3b96f3c5 100644
--- a/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/formjsonfilegenerator/JsonFileGeneratorFactory.java
+++ b/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/formjsonfilegenerator/JsonFileGeneratorFactory.java
@@ -18,6 +18,7 @@ package com.inspur.edp.web.jitruntimebuild.core.formjsonfilegenerator;
import com.inspur.edp.web.common.environment.ExecuteEnvironment;
+import com.inspur.edp.web.common.logger.WebLogger;
import com.inspur.edp.web.jitruntimebuild.api.entity.JitMetadataTypeEnum;
/**
@@ -31,25 +32,25 @@ public class JsonFileGeneratorFactory {
JsonFileGeneratorInterface jsonFileGenerator = null;
switch (metadataType) {
case Frm:
- jsonFileGenerator = new FrmJsonFileGenerator(executeEnvironment,isUpdradeTool);
+ jsonFileGenerator = new FrmJsonFileGenerator(executeEnvironment, isUpdradeTool);
break;
case Eapi:
- jsonFileGenerator = new EapiJsonFileGenerator(executeEnvironment,isUpdradeTool);
+ jsonFileGenerator = new EapiJsonFileGenerator(executeEnvironment, isUpdradeTool);
break;
case Command:
- jsonFileGenerator = new CommandJsonFileGenerator(executeEnvironment,isUpdradeTool);
+ jsonFileGenerator = new CommandJsonFileGenerator(executeEnvironment, isUpdradeTool);
break;
case Resource:
- jsonFileGenerator = new ResourceJsonFileGenerator(executeEnvironment,isUpdradeTool);
+ jsonFileGenerator = new ResourceJsonFileGenerator(executeEnvironment, isUpdradeTool);
break;
case StateMachine:
- jsonFileGenerator = new StateMachineJsonFileGenerator(executeEnvironment,isUpdradeTool);
+ jsonFileGenerator = new StateMachineJsonFileGenerator(executeEnvironment, isUpdradeTool);
break;
case Route:
- jsonFileGenerator = new FormRouteJsonFileGenerator(executeEnvironment,isUpdradeTool);
+ jsonFileGenerator = new FormRouteJsonFileGenerator(executeEnvironment, isUpdradeTool);
break;
default:
- System.out.println("unknown meta data type " + metadataType);
+ WebLogger.Instance.error("unknown meta data type " + metadataType);
break;
}
return jsonFileGenerator;
diff --git a/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/service/JitBuildServiceImp.java b/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/service/JitBuildServiceImp.java
index 0486cbdcde833d5c2d42ccd3c51c9695468557bc..d84db2d041fe3198017b9b4241b79ce43db68141 100644
--- a/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/service/JitBuildServiceImp.java
+++ b/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/service/JitBuildServiceImp.java
@@ -147,7 +147,6 @@ public class JitBuildServiceImp implements JitBuildService {
String babelUrl = FileUtility.getPlatformIndependentPath("/" + buildParameter.getServiceUnitPath() + "/" + "web" + "/" + buildParameter.getBoCode() + "forbabelruntime" + "/" +
buildParameter.getFormName() +
com.inspur.edp.web.jitruntimebuild.core.utility.JitBuildUtility.getExtraPath(buildParameter.getExtraFormPath()) + "/index.html#/" + buildParameter.getFormName());
- System.out.println(babelUrl);
Map mapResult = new HashMap<>();
mapResult.put("babelUrl", babelUrl);
}
diff --git a/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/sourcecodemetadata/SourceCodeMetadataManager.java b/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/sourcecodemetadata/SourceCodeMetadataManager.java
index 4605601477ae69c985a790352af0bbf82287756a..243d6c4550fd284fbaea451e1a7a116336998cbd 100644
--- a/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/sourcecodemetadata/SourceCodeMetadataManager.java
+++ b/runtime-core/src/main/java/com/inspur/edp/web/jitruntimebuild/core/sourcecodemetadata/SourceCodeMetadataManager.java
@@ -77,7 +77,7 @@ public class SourceCodeMetadataManager {
String strFileContent = Base64Utility.decode(item.getSourceFileContent());
// 如果文件内容为空 也进行文件内容的生成操作
String strWriteFilePath = getWriteFilePath(item, buildParameter);
- System.out.println("待写入的目标文件路径为" + strWriteFilePath);
+ WebLogger.Instance.info("待写入的目标文件路径为" + strWriteFilePath, SourceCodeMetadataManager.class.getName());
FileUtility.writeFile(strWriteFilePath, strFileContent);
} catch (UnsupportedEncodingException e) {
WebLogger.Instance.error(e);
@@ -93,8 +93,6 @@ public class SourceCodeMetadataManager {
Path writeFilePath = Paths.get(buildParameter.getBuildAppPath(), generateSourcePath(sourceCodeItemEntity, buildParameter));
String strWritePath = writeFilePath.toString();
-
- System.out.println("target file path is " + strWritePath);
return strWritePath;
}
diff --git a/runtime-scriptcache-api/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/api/webservice/ScriptCacheWebService.java b/runtime-scriptcache-api/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/api/webservice/ScriptCacheWebService.java
index 4e498c55a609231eb81f7c6d9f3b8630bd66bf55..cf35bdeed88891f23cbddf52960233aa3e268a18 100644
--- a/runtime-scriptcache-api/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/api/webservice/ScriptCacheWebService.java
+++ b/runtime-scriptcache-api/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/api/webservice/ScriptCacheWebService.java
@@ -44,7 +44,4 @@ public interface ScriptCacheWebService {
@Path("/checkversion")
ScriptCacheResponse checkVersion(@RequestBody ScriptCacheCheckVersionRequest request);
- @GET
- @Path("/resttest")
- ScriptCacheResponse resttest();
}
diff --git a/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/localserver/LocalServerVersionManager.java b/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/localserver/LocalServerVersionManager.java
index 2666cbb81ca5af544ec2120d58b836d527386d0f..ac22bab7df5f0c32ef127a0a7f353de59bbb20ea 100644
--- a/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/localserver/LocalServerVersionManager.java
+++ b/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/localserver/LocalServerVersionManager.java
@@ -104,7 +104,7 @@ public class LocalServerVersionManager {
if (formScriptCacheList == null || formScriptCacheList.size() == 0) {
cacheResponse.setSuccess(false);
String errorMessage = "根据元数据id获取文件列表为空,对应元数据id:" + formMetadataId;
- System.out.println(errorMessage);
+ WebLogger.Instance.error(errorMessage);
errorMessage = "打开当前维度失败,请在【业务配置中心】,检查此维度是否进行了保存预览操作。相关元数据id:" + formMetadataId;
cacheResponse.setErrorMessage(errorMessage);
return cacheResponse;
@@ -242,20 +242,20 @@ public class LocalServerVersionManager {
}
private void clearDBOAndBECache(String metaDataId) {
- GspMetadata formMetadata = MetadataUtility.getInstance().getCustomizationService().getMetadata(metaDataId);
+ GspMetadata formMetadata = MetadataUtility.getInstance().getMetadataWithRuntime(metaDataId);
if (formMetadata != null) {
FormMetadataContent formMetadataContent = (FormMetadataContent) formMetadata.getContent();
JsonNode content = formMetadataContent.getContents();
String voId = content.at("/module/schemas/0/id").textValue();
if (!StringUtility.isNullOrEmpty(voId)) {
- GspMetadata vo = MetadataUtility.getInstance().getCustomizationService().getMetadata(voId);
+ GspMetadata vo = MetadataUtility.getInstance().getMetadataWithRuntime(voId);
//vo缓存清理
BffEngineCacheService.remove(voId);
WebLogger.Instance.info("清理VO元数据,元数据id为:" + voId, CurrentClassName);
if (vo != null) {
String beId = ((GspViewModel) vo.getContent()).getMapping().getTargetMetadataId();
if (!StringUtility.isNullOrEmpty(beId)) {
- GspMetadata beMetadata = MetadataUtility.getInstance().getCustomizationService().getMetadata(beId);
+ GspMetadata beMetadata = MetadataUtility.getInstance().getMetadataWithRuntime(beId);
// 如果获取到BE元数据
if (beMetadata != null) {
IDatabaseObjectRtService databaseObjectRtService = SpringBeanUtils.getBean(IDatabaseObjectRtService.class);
diff --git a/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/service/ScriptCacheServiceImpl.java b/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/service/ScriptCacheServiceImpl.java
index ab102a45b7d35cccc570a375aac5a103a71c244c..39760cfd66bcaf0ea0d5d37138d18cc28a8af5a6 100644
--- a/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/service/ScriptCacheServiceImpl.java
+++ b/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/service/ScriptCacheServiceImpl.java
@@ -84,13 +84,10 @@ public class ScriptCacheServiceImpl implements ScriptCacheService {
fileList = FileUtility.getFiles(strFolder, true);
} else {
String filePath = FileUtility.combine(strFolder, fileName);
- //fileList = FileUtility.getFiles(filePath, true);
fileList.add(new File(filePath));
}
-
- System.out.println("absoluteBaseDirectory:" + request.getAbsoluteBaseDirectory() + " 获取文件列表个数为:" + fileList.size());
-
+ WebLogger.Instance.info("absoluteBaseDirectory:" + request.getAbsoluteBaseDirectory() + " 获取文件列表个数为:" + fileList.size());
// 如果存在文件列表
if (fileList != null && fileList.size() > 0) {
FormProjectCache finalFormProjectCache = formProjectCache;
diff --git a/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/webservice/ScriptCacheWebServiceImpl.java b/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/webservice/ScriptCacheWebServiceImpl.java
index 5141c991b7a960cdce937d0e1ba225517e018641..19ab8ed93e0b71fd04277b71031f39c346b984fd 100644
--- a/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/webservice/ScriptCacheWebServiceImpl.java
+++ b/runtime-scriptcache/src/main/java/com/inspur/edp/web/jitruntimebuild/scriptcache/webservice/ScriptCacheWebServiceImpl.java
@@ -88,9 +88,4 @@ public class ScriptCacheWebServiceImpl implements ScriptCacheWebService {
return scriptCacheResponse;
}
- @Override
- public ScriptCacheResponse resttest() {
- return null;
- }
-
}
diff --git a/toout.bat b/toout.bat
index 7a2db5f2958597f31ae7ae5a85980dbafbd4e9de..ed885d65012212821654f549bdc1c7275c3b874a 100644
--- a/toout.bat
+++ b/toout.bat
@@ -1,19 +1,3 @@
-#
-# Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
-#
-# 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.
-#
-
@echo off
for /f "tokens=*" %%i in ('CALL .\xpath0.1.bat pom.xml "/project/properties/custom.version"') do set version=%%i
@@ -54,6 +38,8 @@ COPY .\web-frontendproject-api\target\web-jitengine-frontendproject-api-%version
COPY .\web-designschema\target\web-designschema-%version%.jar .\out\server\platform\common\libs\web-designschema.jar
COPY .\web-designschema-api\target\web-designschema-api-%version%.jar .\out\server\platform\common\libs\web-designschema-api.jar
+#COPY .\web-dynamic-form-api\target\web-dynamicform-api-%version%.jar .\out\server\platform\common\libs\web-dynamicform-api.jar
+#COPY .\web-dynamic-form-core\target\web-dynamicform-core-%version%.jar .\out\server\platform\common\libs\web-dynamicform-core.jar
COPY .\web-pageflow-metadata\target\web-pageflow-metadata-%version%.jar .\out\server\platform\common\libs\web-pageflow-metadata.jar
COPY .\web-statemachine\target\web-statemachine-metadata-%version%.jar .\out\server\platform\common\libs\web-statemachine-metadata.jar
diff --git a/web-appconfig-core/src/main/java/com/inspur/edp/web/appconfig/core/service/GspAppConfigService.java b/web-appconfig-core/src/main/java/com/inspur/edp/web/appconfig/core/service/GspAppConfigService.java
index e8623729bb3b44ace78896f2d6e87c6a662caf40..1dd4cdd96b0e95a1faf287bc8167e5c3046aaba7 100644
--- a/web-appconfig-core/src/main/java/com/inspur/edp/web/appconfig/core/service/GspAppConfigService.java
+++ b/web-appconfig-core/src/main/java/com/inspur/edp/web/appconfig/core/service/GspAppConfigService.java
@@ -21,9 +21,9 @@ import com.inspur.edp.lcm.metadata.api.service.MetadataProjectService;
import com.inspur.edp.web.appconfig.api.entity.GspAppConfig;
import com.inspur.edp.web.appconfig.core.appconfig.AppConfigFileManager;
import com.inspur.edp.web.appconfig.core.appconfig.AppConfigFilePathGenerator;
-import com.inspur.edp.web.common.GspProjectUtil;
import com.inspur.edp.web.common.entity.TerminalType;
import com.inspur.edp.web.common.io.FileUtility;
+import com.inspur.edp.web.common.metadata.GspProjectUtility;
import com.inspur.edp.web.common.metadata.MetadataUtility;
import com.inspur.edp.web.common.serialize.SerializeUtility;
import com.inspur.edp.web.common.utility.StringUtility;
@@ -47,6 +47,7 @@ public class GspAppConfigService {
/**
* 基于相对路径(不包含开发路径),获取app.config文件内容
+ *
* @param relativeProjectPath
* @return
*/
@@ -72,6 +73,7 @@ public class GspAppConfigService {
}
return gspAppConfig;
}
+
/**
* 创建app.config.json 空文件
* 如果app.config.json 文件不存在 那么创建对应的文件
@@ -84,6 +86,7 @@ public class GspAppConfigService {
/**
* 获取开发元数据绝对路径 将当前路径和devRootPath合并
+ *
* @param path
* @return
*/
@@ -156,7 +159,7 @@ public class GspAppConfigService {
if (appConfigEntity == null) {
return;
}
- String projectName = GspProjectUtil.getProjectName(projectPath);
+ String projectName = GspProjectUtility.getProjectName(projectPath);
// 如果pc页面流路径不为空
if (!StringUtility.isNullOrEmpty(appConfigEntity.getPageFlowMetadataPath())) {
String relativePageFlowMetadataPath = getRelativePageflowMetadataPath(appConfigEntity.getPageFlowMetadataPath(), projectName);
diff --git a/web-approval-format-core/src/main/java/com/inspur/edp/web/approvalformat/core/service/ApprovalFormatServiceImpl.java b/web-approval-format-core/src/main/java/com/inspur/edp/web/approvalformat/core/service/ApprovalFormatServiceImpl.java
index aaa5ab977f990b4fe8b35b9e586cd26cd810a56d..fdac9add53aab6f72043f06882c4c1654f451e07 100644
--- a/web-approval-format-core/src/main/java/com/inspur/edp/web/approvalformat/core/service/ApprovalFormatServiceImpl.java
+++ b/web-approval-format-core/src/main/java/com/inspur/edp/web/approvalformat/core/service/ApprovalFormatServiceImpl.java
@@ -122,7 +122,6 @@ public class ApprovalFormatServiceImpl implements ApprovalFormatService {
}
}
- // TODO: 迁移到公共方法
private String getServiceUnitCode(String metadataId) {
GspMetadata bizEntityMetadata = this.customizationService.getMetadata(metadataId);
if (bizEntityMetadata == null) {
@@ -418,7 +417,7 @@ public class ApprovalFormatServiceImpl implements ApprovalFormatService {
@Override
public void replicateApprovalFormat(String approvalFormatId) {
- System.out.println("replicateApprovalFormat");
+
}
@Override
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/GSPException.java b/web-common/src/main/java/com/inspur/edp/web/common/GSPException.java
index f30e1798c5489e3eea0bff8350f00a7adb8098ea..2840a544086ffced85b4e28609942cd4446102af 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/GSPException.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/GSPException.java
@@ -21,9 +21,12 @@ import io.iec.edp.caf.commons.exception.ExceptionLevel;
/**
* web自定义异常类
+ *
* @author noah
*/
+@Deprecated
public class GSPException extends CAFRuntimeException {
+
public GSPException(String exceptionCode, String exceptionMessage){
super("", exceptionCode, exceptionMessage, null);
}
@@ -32,9 +35,7 @@ public class GSPException extends CAFRuntimeException {
super("", exceptionCode, exceptionMessage, innerException);
}
- public GSPException(String exceptionCode, String exceptionMessage, Exception cause, ExceptionLevel errorLevel, boolean bizException) {
- super("", exceptionCode, exceptionMessage, cause, errorLevel, bizException);
- }
+
public GSPException(String exceptionCode, String exceptionMessage, RuntimeException exception, ExceptionLevel errorLevel) {
super("", exceptionCode, exceptionMessage, exception, errorLevel);
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/customexception/WebCustomException.java b/web-common/src/main/java/com/inspur/edp/web/common/customexception/WebCustomException.java
new file mode 100644
index 0000000000000000000000000000000000000000..2af9edc612250dfdf8676b9baf95bae65dcf4145
--- /dev/null
+++ b/web-common/src/main/java/com/inspur/edp/web/common/customexception/WebCustomException.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.common.customexception;
+
+import io.iec.edp.caf.commons.exception.CAFRuntimeException;
+import io.iec.edp.caf.commons.exception.ExceptionLevel;
+
+/**
+ * web 自定义异常 对界面的提示异常,无需捕获其堆栈
+ *
+ * @author guozhiqi
+ */
+public class WebCustomException extends CAFRuntimeException {
+
+ /**
+ * 自定义异常定义 设置默认的日志级别为:Error
+ *
+ * @param message
+ */
+ public WebCustomException(String message) {
+ this(message, ExceptionLevel.Error);
+ }
+
+ /**
+ * 自定义异常定义 包含message和内部异常
+ *
+ * @param message
+ * @param innerException
+ */
+ public WebCustomException(String message, Exception innerException) {
+ this("", "", message, innerException, ExceptionLevel.Error, true);
+ }
+
+ public WebCustomException(String message, Exception innerException, ExceptionLevel exceptionLevel) {
+ this("", "", message, innerException, exceptionLevel, true);
+ }
+
+ /**
+ * 自定义异常类 构造的异常为业务异常
+ *
+ * @param message 异常信息
+ * @param level 日志级别
+ */
+ public WebCustomException(String message, ExceptionLevel level) {
+ this(message, level, true);
+ }
+
+ public WebCustomException(String message, ExceptionLevel level, boolean bizException) {
+ super("", "", message, null, level, bizException);
+ }
+
+
+ public WebCustomException(String serviceUnitCode, String exceptionCode, String message, Exception innerException, ExceptionLevel level, boolean bizException) {
+ super(serviceUnitCode, exceptionCode, message, innerException, level, bizException);
+ }
+}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/entity/TerminalType.java b/web-common/src/main/java/com/inspur/edp/web/common/entity/TerminalType.java
index 279d08d1941bbdeaa298abdb5aff982e202857f3..cefe3a7ee656eaedb24a3c3ed9def74ea4cf7e50 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/entity/TerminalType.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/entity/TerminalType.java
@@ -242,9 +242,10 @@ public enum TerminalType {
/**
* 获取对应的框架类型 主要为Angular 或 Vue
+ *
* @return
*/
- public abstract String getFrameworkType();
+ public abstract String getFrameworkType();
/**
* 获取表单相对路径,相对于metadata目录
@@ -315,6 +316,22 @@ public enum TerminalType {
return suffixList;
}
+ /**
+ * 根据源数据类型转换成对应的元数据类型
+ *
+ * @param sourceMetadataType
+ * @return
+ */
+ public static TerminalType fromMetadataType(String sourceMetadataType) {
+ if (TerminalType.PC.getMetadataType().equals(sourceMetadataType)) {
+ return TerminalType.PC;
+ } else if (TerminalType.MOBILE.getMetadataType().equals(sourceMetadataType)) {
+ return TerminalType.MOBILE;
+ } else {
+ throw new RuntimeException("未知的数据类型转换成TerminalType,对应数据类型为:" + sourceMetadataType);
+ }
+ }
+
/**
* 关联页面流常量定义
*/
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/environment/ExecuteEnvironment.java b/web-common/src/main/java/com/inspur/edp/web/common/environment/ExecuteEnvironment.java
index c8cced940366eda7ef65c4a7ca6d47f7b6b7a49c..d18f205c328af8027296acc499d17e97af28d2d9 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/environment/ExecuteEnvironment.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/environment/ExecuteEnvironment.java
@@ -22,6 +22,9 @@ package com.inspur.edp.web.common.environment;
* @author guozhiqi
*/
public enum ExecuteEnvironment {
+ /**
+ * 枚举名称Design
+ */
Design {
@Override
public String getName() {
@@ -29,6 +32,9 @@ public enum ExecuteEnvironment {
}
},
+ /**
+ * 枚举名称Runtime
+ */
Runtime {
@Override
public String getName() {
@@ -36,12 +42,16 @@ public enum ExecuteEnvironment {
}
},
+ /**
+ * 枚举名称
+ */
UpgradeTool {
@Override
public String getName() {
return "UpgradeTool";
}
- }, None {
+ },
+ None {
/**
* 未指定具体运行位置
* @return
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 3aaed1f8b5d7455d5bf55d287b2c0160024725e0..108f2436b09891d0efb34391f5bb4f1ece41c3d3 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
@@ -688,11 +688,9 @@ public class FileUtility {
for (int i = 0; i < len1; i++) {
//只要有一个字节不同,两个文件就不一样
if (data1[i] != data2[i]) {
- System.out.println("文件内容不一样");
return false;
}
}
- System.out.println("两个文件完全相同");
return true;
} else {
//长度不一样,文件肯定不同
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/io/NodejsFunctionUtility.java b/web-common/src/main/java/com/inspur/edp/web/common/io/NodejsFunctionUtility.java
index 2df73c989433d7e4adc61536182c5d80c746c06d..cbd29a04ab8aacc51e05da1ca2df5f0844c620f8 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/io/NodejsFunctionUtility.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/io/NodejsFunctionUtility.java
@@ -56,7 +56,8 @@ public class NodejsFunctionUtility {
String nodeJsPath = getNodeJsPathInServer();
if (OperatingSystemUtility.isWindows()) {
nodeJsPath = FileUtility.combine(nodeJsPath, "amd64-win");
- } else {
+ } else if (OperatingSystemUtility.isLinux() && !OperatingSystemUtility.isMac()) {
+ // 由于内置的无法支持mac 因此mac采用外置的形式
if (nodeJsCommandEnum == NodeJsCommandEnum.Node) {
nodeJsPath = FileUtility.combine(nodeJsPath, "x86_64-linux", "bin");
} else {
@@ -94,7 +95,7 @@ public class NodejsFunctionUtility {
FileUtility.setPermission(currentNodeCommand);
} else {
- String nodeCommandName =nodeJsCommandEnum.commandName();
+ String nodeCommandName = nodeJsCommandEnum.commandName();
nodeCommand = nodeCommandName;
if (hasNodePackage) {
nodeCommand = FileUtility.combine(nodeJsPath, nodeCommandName);
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/logger/WebLogger.java b/web-common/src/main/java/com/inspur/edp/web/common/logger/WebLogger.java
index 569833a4222e5b88e9eae26004690de83549357b..b1d3fcc10c37026dcbb7135d5870900f69dc6840 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/logger/WebLogger.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/logger/WebLogger.java
@@ -116,7 +116,7 @@ public enum WebLogger {
return LoggerFactory.getLogger(name);
}
- private String defaultLoggerName = WebLogger.class.getName();
+ private final String defaultLoggerName = WebLogger.class.getName();
/**
@@ -197,6 +197,7 @@ public enum WebLogger {
/**
* 创建对应的logger实例
* 提取函数,避免方法过长且复杂
+ *
* @param loggerName
* @return
*/
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/metadata/AfterGetReferenceWebComponentMetadataInvoker.java b/web-common/src/main/java/com/inspur/edp/web/common/metadata/AfterGetReferenceWebComponentMetadataInvoker.java
new file mode 100644
index 0000000000000000000000000000000000000000..b86c22668447848ae33c5d1ae893878cedffc33f
--- /dev/null
+++ b/web-common/src/main/java/com/inspur/edp/web/common/metadata/AfterGetReferenceWebComponentMetadataInvoker.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.common.metadata;
+
+import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
+import com.inspur.edp.web.command.component.metadata.CmpMethodRefering;
+
+@FunctionalInterface
+public interface AfterGetReferenceWebComponentMetadataInvoker {
+ void invoke(GspMetadata commandMetadata, CmpMethodRefering methodReferingItem, GspMetadata webComponentMetadata, Object... outParameterArray);
+}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/GspProjectUtil.java b/web-common/src/main/java/com/inspur/edp/web/common/metadata/GspProjectUtility.java
similarity index 52%
rename from web-common/src/main/java/com/inspur/edp/web/common/GspProjectUtil.java
rename to web-common/src/main/java/com/inspur/edp/web/common/metadata/GspProjectUtility.java
index 68bb14e628adec9a1f345b1f186ae3f62ed5e8a8..3c339e121f1a26704f568b4ef77539deaf67bbc3 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/GspProjectUtil.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/metadata/GspProjectUtility.java
@@ -14,31 +14,37 @@
* limitations under the License.
*/
-package com.inspur.edp.web.common;
+package com.inspur.edp.web.common.metadata;
import com.inspur.edp.lcm.metadata.api.entity.GspProject;
import com.inspur.edp.lcm.metadata.api.service.GspProjectService;
+import com.inspur.edp.web.common.customexception.WebCustomException;
+import com.inspur.edp.web.common.logger.WebLogger;
+import io.iec.edp.caf.commons.exception.ExceptionLevel;
import io.iec.edp.caf.commons.utils.SpringBeanUtils;
/**
+ * GspProject 工程信息Utility
+ *
* @author guozhiqi
*/
-public class GspProjectUtil {
+public class GspProjectUtility {
/**
- * 依据工程路径获取对应的工程信息
+ * 获取工程信息
*
* @param projectPath
* @return
*/
- public static GspProject getGspProject(String projectPath) {
+ public static GspProject getProjectInformation(String projectPath) {
try {
- GspProjectService gspProjectService = SpringBeanUtils.getBean(GspProjectService.class);
- return gspProjectService.getGspProjectInfo(projectPath);
- } catch (Exception e) {
- throw new RuntimeException(e.getMessage(), e);
+ return GspProjectServiceInstance.get().getGspProjectInfo(projectPath);
+ } catch (Exception ex) {
+ WebLogger.Instance.error(ex, GspProjectUtility.class.getName());
+ throw new WebCustomException("获取工程信息出现错误," + ex.getMessage(), ExceptionLevel.Error);
}
}
+
/**
* 根据工程路径获取工程名称 获取的是其对应的小写形式
*
@@ -46,16 +52,39 @@ public class GspProjectUtil {
* @return 工程名称
*/
public static String getProjectName(String projectPath) {
- GspProject currentProject = getGspProject(projectPath);
+ GspProject currentProject = getProjectInformation(projectPath);
return getProjectName(currentProject);
}
/**
* 获取工程名称的小写形式
+ *
* @param gspProject
* @return
*/
public static String getProjectName(GspProject gspProject) {
return gspProject.getMetadataProjectName().toLowerCase();
}
+
+ /**
+ * 从工程路径中获取su路径,统一使用小写
+ *
+ * @param projectPath
+ * @return
+ */
+ public String getServiceUnitPath(String projectPath) {
+ GspProject currentProject = getProjectInformation(projectPath);
+ return currentProject.getSuDeploymentPath().toLowerCase();
+ }
+
+ /**
+ * GspProjectService
+ */
+ private static class GspProjectServiceInstance {
+ public static GspProjectService get() {
+ return SpringBeanUtils.getBean(GspProjectService.class);
+ }
+ }
+
+
}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataGetterParameter.java b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataGetterParameter.java
index fe189ed5832a920b930830d4ed543488380d784c..14bfac2b69ff4e3c95b5f835a260b0f8019b404e 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataGetterParameter.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataGetterParameter.java
@@ -17,88 +17,79 @@
package com.inspur.edp.web.common.metadata;
import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
+import com.inspur.edp.web.common.customexception.WebCustomException;
+import com.inspur.edp.web.common.utility.StringUtility;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
-public class MetadataGetterParameter {
- private MetadataGetterParameter(String targetMetadataId, String spacePath) {
- this.targetMetadataId = targetMetadataId;
- this.targetMetadataSpacePath = spacePath;
- }
+import java.io.Serializable;
+/**
+ * 元数据获取请求参数
+ *
+ * @author noah
+ */
+public class MetadataGetterParameter implements Serializable {
- /**
- * 构造对应的参数实例
- *
- * @param targetMetadataId
- * @param spacePath
- * @return
- */
- public static MetadataGetterParameter getNewInstance(String targetMetadataId, String spacePath) {
- return new MetadataGetterParameter(targetMetadataId, spacePath);
- }
+ private static final long serialVersionUID = 523654455L;
/**
- * 引用目标元数据的元数据id
+ * 请求参数 源 元数据信息
*/
@Getter
@Setter
- private String sourceMetadataId;
+ private GetterMetadataInfo sourceMetadataInfo;
/**
- * 引用目标元数据的元数据code
+ * 请求参数 目标 元数据信息
*/
@Getter
@Setter
- private String sourceMetadataCode;
+ private GetterMetadataInfo targetMetadataInfo;
- /**
- * 源数据 元数据类型
- */
- @Getter
- @Setter
- private MetadataTypeEnum sourceMetadataType = MetadataTypeEnum.Frm;
/**
- * 引用目标元数据的元数据path
+ * 元数据找不到自定义异常提示 应对的是sourceMetadataCode
*/
@Getter
@Setter
- private String sourceMetadataPath;
+ private String targetMetadataNotFoundMessage;
- /**
- * 源metadata nameSpace
- */
- @Getter
- @Setter
- private String sourceMetadataNameSpace;
+ private MetadataGetterParameter(String targetMetadataId, String spacePath, MetadataTypeEnum metadataType) {
+ this();
- /**
- * 目标元数据的元数据uri
- */
- @Getter
- private String targetMetadataId;
+ this.targetMetadataInfo.setId(targetMetadataId);
+ this.targetMetadataInfo.setNameSpace(spacePath);
+ this.targetMetadataInfo.setMetadataType(metadataType);
+ }
+
+ private MetadataGetterParameter() {
+ this.sourceMetadataInfo = new GetterMetadataInfo();
+ this.targetMetadataInfo = new GetterMetadataInfo();
+ }
- /**
- * 目标元数据 类型
- */
- @Getter
- @Setter
- private MetadataTypeEnum targetMetadataType;
/**
- * 目标元数据的 path
+ * 构造对应的参数实例
+ *
+ * @param targetMetadataId 目标元数据id
+ * @param spacePath 目标元数据spacePath
+ * @param metadataType 目标元数据的元数据类型
+ * @return
*/
- @Getter
- private String targetMetadataSpacePath;
+ public static MetadataGetterParameter getNewInstance(String targetMetadataId, String spacePath, MetadataTypeEnum metadataType) {
+ return new MetadataGetterParameter(targetMetadataId, spacePath, metadataType);
+ }
/**
- * 元数据找不到自定义异常提示 应对的是sourceMetadataCode
+ * 增加此方法的目的是为了可以直接对请求参数直接赋值
+ *
+ * @return
*/
- @Getter
- @Setter
- private String targetMetadataNotFoundMessage;
+ public static MetadataGetterParameter getNewInstance() {
+ return new MetadataGetterParameter();
+ }
/**
* 仅包含目标元数据的id
@@ -106,7 +97,14 @@ public class MetadataGetterParameter {
* @return
*/
public WebMetadataUri getTargetMetadataUri() {
- return new WebMetadataUri(this.getTargetMetadataId());
+ if (this.getTargetMetadataInfo() == null) {
+ throw new WebCustomException("元数据请求参数,目标元数据参数不能为空");
+ }
+ return new WebMetadataUri(this.getTargetMetadataInfo().getId(),
+ this.getTargetMetadataInfo().getCode(),
+ this.getTargetMetadataInfo().getName(),
+ this.getTargetMetadataInfo().getMetadataType().getCode(),
+ this.getTargetMetadataInfo().getNameSpace(), this.getTargetMetadataNotFoundMessage());
}
/**
@@ -115,10 +113,14 @@ public class MetadataGetterParameter {
* @return
*/
public WebMetadataUri getSourceMetadataUri() {
- if (this.getSourceMetadataType() == null) {
- this.setSourceMetadataType(MetadataTypeEnum.Frm);
+ if (this.getSourceMetadataInfo() == null) {
+ return null;
}
- return new WebMetadataUri(this.getSourceMetadataId(), this.getSourceMetadataCode(), this.getSourceMetadataType().getCode(), this.getSourceMetadataNameSpace());
+ return new WebMetadataUri(this.getSourceMetadataInfo().getId(),
+ this.getSourceMetadataInfo().getCode(),
+ this.getSourceMetadataInfo().getName(),
+ this.getSourceMetadataInfo().getMetadataType().getCode(),
+ this.getSourceMetadataInfo().getPath(), null);
}
/**
@@ -128,10 +130,81 @@ public class MetadataGetterParameter {
* @param sourceMetadataType
*/
public void setSourceMetadata(GspMetadata gspMetadata, MetadataTypeEnum sourceMetadataType) {
- this.sourceMetadataId = gspMetadata.getHeader().getId();
- this.sourceMetadataPath = gspMetadata.getRelativePath();
- this.sourceMetadataNameSpace = gspMetadata.getHeader().getNameSpace();
- this.sourceMetadataCode = gspMetadata.getHeader().getCode();
- this.sourceMetadataType = sourceMetadataType;
+ this.setSourceMetadataId(gspMetadata.getHeader().getId());
+ this.setSourceMetadataCode(gspMetadata.getHeader().getCode());
+ this.setSourceMetadataName(gspMetadata.getHeader().getName());
+ this.setSourceMetadataNamespace(gspMetadata.getHeader().getNameSpace());
+ this.setSourceMetadataPath(gspMetadata.getRelativePath());
+ this.setSourceMetadataType(sourceMetadataType);
}
+
+ public void setSourceMetadataId(String metadataId) {
+ this.sourceMetadataInfo.setId(metadataId);
+ }
+
+ public void setSourceMetadataCode(String metadataCode) {
+ this.sourceMetadataInfo.setCode(metadataCode);
+ }
+
+ public void setSourceMetadataName(String metadataName) {
+ this.sourceMetadataInfo.setName(metadataName);
+ }
+
+ public void setSourceMetadataType(MetadataTypeEnum metadataType) {
+ this.sourceMetadataInfo.setMetadataType(metadataType);
+ }
+
+ public void setSourceMetadataPath(String metadataPath) {
+ this.sourceMetadataInfo.setPath(metadataPath);
+ }
+
+ public void setSourceMetadataNamespace(String metadataNamespace) {
+ this.sourceMetadataInfo.setNameSpace(metadataNamespace);
+ }
+
+
+ public void setTargetMetadataCode(String metadataCode) {
+ this.targetMetadataInfo.setCode(metadataCode);
+ }
+
+ public void setTargetMetadataName(String metadataName) {
+ this.targetMetadataInfo.setName(metadataName);
+ }
+
+
+ public void setTargetMetadataNamespace(String metadataNamespace) {
+ this.targetMetadataInfo.setNameSpace(metadataNamespace);
+ }
+
+ /**
+ * 参数中元数据信息
+ */
+ @Data
+ public static class GetterMetadataInfo {
+ /**
+ * 请求参数中元数据id
+ */
+ private String id;
+ /**
+ * 请求参数中元数据code
+ */
+ private String code;
+ /**
+ * 请求参数中元数据name
+ */
+ private String name;
+ /**
+ * 请求参数元数据类型
+ */
+ private MetadataTypeEnum metadataType = MetadataTypeEnum.Frm;
+ /**
+ * 请求参数中元数据路径
+ */
+ private String path;
+ /**
+ * 请求参数中元数据namespace
+ */
+ private String nameSpace;
+ }
+
}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataProjectUtility.java b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataProjectUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..df2afd41e9d74d8565ba775ff5a9a806461cee85
--- /dev/null
+++ b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataProjectUtility.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.common.metadata;
+
+import com.inspur.edp.lcm.metadata.api.entity.MetadataProject;
+import com.inspur.edp.lcm.metadata.api.service.MetadataProjectService;
+import com.inspur.edp.web.common.utility.StringUtility;
+import io.iec.edp.caf.commons.utils.SpringBeanUtils;
+
+/**
+ * 元数据工程信息utility
+ *
+ * @author guozhiqi
+ */
+public class MetadataProjectUtility {
+ /**
+ * 根据元数据相对路径获取工程信息
+ *
+ * @param metadataRelativePath
+ * @return
+ */
+ public static MetadataProject getMetadataProject(String metadataRelativePath) {
+ if (StringUtility.isNullOrEmpty(metadataRelativePath)) {
+ return null;
+ }
+
+ return MetadataProjectServiceInstance.get().getMetadataProjInfo(metadataRelativePath);
+ }
+
+ private static class MetadataProjectServiceInstance {
+ public static MetadataProjectService get() {
+ return SpringBeanUtils.getBean(MetadataProjectService.class);
+ }
+ }
+
+}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataTypeEnum.java b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataTypeEnum.java
index 77f1b3bdc549d6ba9a6277ec2dd4556a87388986..b71444de5edf439bf5972b50bb1098a715d560ae 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataTypeEnum.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataTypeEnum.java
@@ -16,6 +16,8 @@
package com.inspur.edp.web.common.metadata;
+import com.inspur.edp.web.common.logger.WebLogger;
+
/**
* 定义元数据类型枚举参数
*
@@ -30,6 +32,11 @@ public enum MetadataTypeEnum {
public String getCode() {
return "Form";
}
+
+ @Override
+ public String getName() {
+ return "表单元数据";
+ }
},
/**
* eapi 元数据
@@ -39,6 +46,11 @@ public enum MetadataTypeEnum {
public String getCode() {
return "Eapi";
}
+
+ @Override
+ public String getName() {
+ return "Eapi元数据";
+ }
},
/**
* 资源元数据
@@ -48,6 +60,11 @@ public enum MetadataTypeEnum {
public String getCode() {
return "Resource";
}
+
+ @Override
+ public String getName() {
+ return "资源元数据";
+ }
},
/**
* 状态机元数据
@@ -57,6 +74,11 @@ public enum MetadataTypeEnum {
public String getCode() {
return "StateMachine";
}
+
+ @Override
+ public String getName() {
+ return "状态机元数据";
+ }
},
/**
* 命令元数据
@@ -66,6 +88,11 @@ public enum MetadataTypeEnum {
public String getCode() {
return "Command";
}
+
+ @Override
+ public String getName() {
+ return "命令元数据";
+ }
},
/**
* 页面流
@@ -75,18 +102,58 @@ public enum MetadataTypeEnum {
public String getCode() {
return "PageFlow";
}
+
+ @Override
+ public String getName() {
+ return "页面流元数据";
+ }
+ },
+ /**
+ * 源代码文件定义
+ */
+ SourceCode {
+ @Override
+ public String getCode() {
+ return "SourceCode";
+ }
+
+ @Override
+ public String getName() {
+ return "SourceCode元数据";
+ }
},
Component {
@Override
public String getCode() {
return "Component";
}
+
+ @Override
+ public String getName() {
+ return "构件元数据";
+ }
},
ViewModel {
@Override
public String getCode() {
return "ViewModel";
}
+
+ @Override
+ public String getName() {
+ return "视图模型";
+ }
+ },
+ TS {
+ @Override
+ public String getCode() {
+ return "Ts";
+ }
+
+ @Override
+ public String getName() {
+ return "自定义构件元数据";
+ }
};
/**
@@ -96,6 +163,24 @@ public enum MetadataTypeEnum {
*/
public abstract String getCode();
+ public abstract String getName();
+
+ /**
+ * 执行类型转换
+ *
+ * @param metadataType
+ * @return
+ */
+ public static MetadataTypeEnum from(String metadataType) {
+ try {
+ MetadataTypeEnum metadataTypeEnum = MetadataTypeEnum.valueOf(metadataType);
+ return metadataTypeEnum;
+ } catch (Exception ex) {
+ WebLogger.Instance.error("元数据类型转换失败,待转换类型为:" + metadataType);
+ }
+ return MetadataTypeEnum.Frm;
+ }
+
@Override
public String toString() {
return this.getCode();
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 f2ce5692abe789e0958c62c5b77aa20f5167ee4e..4ee133365ae4648c4983b9ee954d1f201b837e4f 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
@@ -19,31 +19,18 @@ package com.inspur.edp.web.common.metadata;
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.GspProject;
-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.entity.uri.MetadataURI;
-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 com.inspur.edp.lcm.metadata.devcommon.ManagerUtils;
-import com.inspur.edp.metadata.rtcustomization.api.CustomizationService;
-import com.inspur.edp.metadata.rtcustomization.serverapi.CustomizationServerService;
import com.inspur.edp.web.command.component.metadata.*;
-import com.inspur.edp.web.common.GSPException;
+import com.inspur.edp.web.common.customexception.WebCustomException;
import com.inspur.edp.web.common.environment.ExecuteEnvironment;
import com.inspur.edp.web.common.io.FileUtility;
-import com.inspur.edp.web.common.logger.WebLogger;
import com.inspur.edp.web.common.utility.StringUtility;
-import io.iec.edp.caf.commons.utils.SpringBeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import java.io.IOException;
-import java.nio.file.Paths;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.function.Supplier;
/**
* 元数据工具类
@@ -52,106 +39,86 @@ import java.util.List;
*/
public final class MetadataUtility {
- @Autowired
- MetadataService metadataService;
-
- @Autowired
- RefCommonService refCommonService;
-
- @Autowired
- MetadataProjectService metadataProjectService;
-
- @Autowired
- GspProjectService gspProjectService;
-
- @Autowired
- CustomizationService customizationService;
-
- @Autowired
- CustomizationServerService customizationServerService;
+ private MetadataUtility() {
- public MetadataService getMetadataService() {
- if (metadataService == null) {
- metadataService = SpringBeanUtils.getBean(MetadataService.class);
- }
- return metadataService;
}
- public RefCommonService getRefCommonService() {
- if (refCommonService == null) {
- refCommonService = SpringBeanUtils.getBean(RefCommonService.class);
- }
- return refCommonService;
+ /**
+ * 不再保持单例 使用spring自带的缓存bean进行读取
+ *
+ * @return
+ */
+ public static MetadataUtility getInstance() {
+ return new MetadataUtility();
}
- public MetadataProjectService getMetadataProjectService() {
- if (metadataProjectService == null) {
- metadataProjectService = SpringBeanUtils.getBean(MetadataProjectService.class);
- }
- return metadataProjectService;
+ /**
+ * 根据元数据名称及元数据所在路径获取元数据信息。该方法不支持跨工程引用
+ *
+ * @param metadataFileName
+ * @param metadataPath
+ * @return
+ */
+ public GspMetadata getMetadataWithDesign(String metadataFileName, String metadataPath) {
+ return MetadataUtilityWithDesign.getMetadata(metadataFileName, metadataPath);
}
- public GspProjectService getGspProjectService() {
- if (gspProjectService == null) {
- gspProjectService = SpringBeanUtils.getBean(GspProjectService.class);
- }
- return gspProjectService;
+ /**
+ * @param metadataGetterParameter
+ * @return
+ */
+ public GspMetadata getMetadataWithDesign(MetadataGetterParameter metadataGetterParameter) {
+ return MetadataUtilityWithDesign.getMetadata(metadataGetterParameter);
}
- public CustomizationService getCustomizationService() {
- if (customizationService == null) {
- customizationService = SpringBeanUtils.getBean(CustomizationService.class);
- }
- return customizationService;
+ /**
+ * 获取指定类型的元数据
+ *
+ * @param projectPath
+ * @param metadataType
+ * @return
+ */
+ public List getMetadataListInProjectWithDesign(String projectPath, String metadataType) {
+ return MetadataUtilityWithDesign.getMetadataListInProject(projectPath, metadataType);
}
- public CustomizationServerService getCustomizationServerService() {
- if (customizationServerService == null) {
- customizationServerService = SpringBeanUtils.getBean(CustomizationServerService.class);
- }
- return customizationServerService;
+ /**
+ * 删除对应的元数据物理文件
+ *
+ * @param metadataPath 元数据所属路径
+ * @param metadataFileName 元数据对应的文件名称
+ */
+ public void deleteMetadataWithDesign(String metadataPath, String metadataFileName) {
+ MetadataUtilityWithDesign.deleteMetadata(metadataPath, metadataFileName);
}
-
- private MetadataUtility() {
-
+ /**
+ * 元数据保存 如果元数据已经存在,则先进行删除旧的元数据文件
+ *
+ * @param metadata
+ */
+ public void saveMetadataWithDesign(GspMetadata metadata) {
+ MetadataUtilityWithDesign.saveMetadata(metadata);
}
- private static final Object _lock = new Object();
- private static volatile MetadataUtility metadataUtilityInstance = null;
-
- public static MetadataUtility getInstance() {
- if (metadataUtilityInstance == null) {
- synchronized (_lock) {
- if (metadataUtilityInstance == null) {
- metadataUtilityInstance = new MetadataUtility();
- }
- }
- }
- return metadataUtilityInstance;
+ public List getMetadataListWithDesign(String spacePath, List metadataTypes) {
+ return MetadataUtilityWithDesign.getMetadataList(spacePath, metadataTypes);
}
-
- @FunctionalInterface
- public interface AfterGetReferenceWebComponentMetadata {
- void invoke(GspMetadata commandMetadata, CmpMethodRefering methodReferingItem, GspMetadata webComponentMetadata, Object... outParameterArray);
+ public List getMetadataListWithDesign(String spacePath) {
+ return MetadataUtilityWithDesign.getMetadataList(spacePath, null);
}
/**
- * 根据元数据名称及元数据所在路径获取元数据信息。该方法不支持跨工程引用
+ * 创建表单元数据 如果已经存在 不进行创建,否则进行元数据的创建
*
- * @param metadataFileName
- * @param metadataPath
- * @return
+ * @param metadata 待保存元数据
*/
- public GspMetadata getMetadata(String metadataFileName, String metadataPath) {
- if (StringUtility.isNullOrEmpty(metadataFileName) || StringUtility.isNullOrEmpty(metadataPath)) {
- return null;
- }
-
- return this.getMetadataService().loadMetadata(metadataFileName, metadataPath);
+ public void createMetadataIfNotExistsWithDesign(GspMetadata metadata) {
+ MetadataUtilityWithDesign.createMetadataIfNotExists(metadata);
}
+
/**
* 判断指定路径 指定文件名称元数据是否存在
*
@@ -159,8 +126,8 @@ public final class MetadataUtility {
* @param metadataId
* @return
*/
- public boolean isMetaDataExistsWithMetadataIDAndPath(String spacePath, String metadataId) {
- return this.getMetadataService().isMetadataExistInProject(spacePath, metadataId);
+ public boolean isMetaDataExistsWithMetadataIDAndPathWithDesign(String spacePath, String metadataId) {
+ return MetadataUtilityWithDesign.isMetaDataExistsWithMetadataIDAndPath(spacePath, metadataId);
}
/**
@@ -170,25 +137,32 @@ public final class MetadataUtility {
* @param fileName 对应的元数据文件名称
* @return
*/
- public boolean isMetaDataExistsWithMetadataPathAndFileName(String metaDataPath, String fileName) {
- return this.getMetadataService().isMetadataExist(metaDataPath, fileName);
+ public boolean isMetaDataExistsWithMetadataPathAndFileNameWithDesign(String metaDataPath, String fileName) {
+ return MetadataUtilityWithDesign.isMetaDataExistsWithMetadataPathAndFileName(metaDataPath, fileName);
}
/**
- * 根据元数据id获取元数据信息
+ * 根据元数据参数信息获取对应的元数据
*
- * @param metadataId
+ * @param targetMetadataInfo 目标元数据参数配置
+ * @param sourceMetadataInfo 源 元数据参数配置
+ * @param customTargetMetadataNotFoundMessage 自定义 元数据找不到异常提示
+ * @param executeEnvironment
+ * @param isInUpgradeTool
* @return
*/
- public GspMetadata getMetadataWithEnvironment(String metadataId, ExecuteEnvironment executeEnvironment, boolean isInUpgradeTool) {
- if (StringUtility.isNullOrEmpty(metadataId)) {
+ public GspMetadata getMetadataWithEnvironment(MetadataGetterParameter.GetterMetadataInfo targetMetadataInfo,
+ MetadataGetterParameter.GetterMetadataInfo sourceMetadataInfo,
+ String customTargetMetadataNotFoundMessage,
+ ExecuteEnvironment executeEnvironment, boolean isInUpgradeTool) {
+ if (targetMetadataInfo == null || StringUtility.isNullOrEmpty(targetMetadataInfo.getId())) {
return null;
}
// 如果在升级工具中执行
if (isInUpgradeTool) {
- if (this.getCustomizationServerService() != null) {
- return this.getCustomizationServerService().getMetadata(metadataId);
+ if (MetadataUtilityWithRuntimeRpc.hasCustomizationServerServiceInstance()) {
+ return MetadataUtilityWithRuntimeRpc.getMetadata(targetMetadataInfo.getId());
} else {
// 如果获取不到 那么设定执行运行时获取
executeEnvironment = ExecuteEnvironment.Runtime;
@@ -197,121 +171,81 @@ public final class MetadataUtility {
if (executeEnvironment.equals(ExecuteEnvironment.Design)) {
// 设计时元数据获取
- return this.getMetadataInDesign(new MetadataURI(metadataId), null, null);
+ MetadataGetterParameter metadataGetterParameter = MetadataGetterParameter.getNewInstance();
+ metadataGetterParameter.setTargetMetadataInfo(targetMetadataInfo);
+ metadataGetterParameter.setSourceMetadataInfo(sourceMetadataInfo);
+ metadataGetterParameter.setTargetMetadataNotFoundMessage(customTargetMetadataNotFoundMessage);
+ return MetadataUtilityWithDesign.getMetadata(metadataGetterParameter.getTargetMetadataUri(), metadataGetterParameter.getSourceMetadataUri(), targetMetadataInfo.getPath());
} else {
- return this.getCustomizationService().getMetadata(metadataId);
+ return MetadataUtilityWithRuntime.getMetadata(targetMetadataInfo.getId());
}
}
-
/**
- * @param metadataGetterParameter
- * @return
- */
- public GspMetadata getMetadataInDesign(MetadataGetterParameter metadataGetterParameter) {
- return this.getMetadataInDesign(metadataGetterParameter.getTargetMetadataUri(), metadataGetterParameter.getSourceMetadataUri(), metadataGetterParameter.getTargetMetadataSpacePath());
- }
-
- public GspMetadata getMetadataInDesign(MetadataURI targetMetadataUri, MetadataURI sourceMetadataUri, String projectPath) {
- return this.getRefCommonService().getRefMetadata(targetMetadataUri, sourceMetadataUri, projectPath);
- }
-
- /**
- * 运行时获取元数据接口方法
- * 作为公共方法 会在别处进行使用 定义后不允许更改
+ * 根据元数据id获取元数据信息
*
- * @param metadataId
+ * @param targetMetadataInfo 目标元数据信息不能为空
+ * @param sourceMetadataInfo 如果为运行时,可以为空
+ * @param executeEnvironment 执行环境:运行时或设计时
+ * @param isInUpgradeTool 是否运行在补丁工具中
* @return
*/
- public GspMetadata getMetadataInRuntime(String metadataId) {
- return getMetadataWithEnvironment(metadataId, ExecuteEnvironment.Runtime, false);
+ public GspMetadata getMetadataWithEnvironment(MetadataGetterParameter.GetterMetadataInfo targetMetadataInfo,
+ MetadataGetterParameter.GetterMetadataInfo sourceMetadataInfo,
+ ExecuteEnvironment executeEnvironment, boolean isInUpgradeTool) {
+ return this.getMetadataWithEnvironment(targetMetadataInfo, sourceMetadataInfo, null, executeEnvironment, isInUpgradeTool);
}
- /**
- * 创建表单元数据 如果已经存在 不进行创建,否则进行元数据的创建
- *
- * @param metadata 待保存元数据
- */
- public void createMetadataIfNotExists(GspMetadata metadata) {
- MetadataService metadataService = SpringBeanUtils.getBean(MetadataService.class);
- // 元数据文件不存在时进行创建
- if (!metadataService.isMetadataExist(metadata.getRelativePath(), metadata.getHeader().getFileName())) {
- metadataService.createMetadata(metadata.getRelativePath(), metadata);
+ public GspMetadata getMetadataWithEnvironment(Supplier targetMetadataInfoSupplierAction,
+ Supplier sourceMetadataInfoSupplierAction,
+ ExecuteEnvironment executeEnvironment, boolean isInUpgradeTool) {
+ if (targetMetadataInfoSupplierAction == null) {
+ return null;
}
- }
-
-
- /**
- * 删除对应的元数据物理文件
- *
- * @param metadataPath 元数据所属路径
- * @param metadataFileName 元数据对应的文件名称
- */
- public void deleteMetadataInDisk(String metadataPath, String metadataFileName) {
- if (StringUtility.isNullOrEmpty(metadataFileName)) {
- return;
+ MetadataGetterParameter.GetterMetadataInfo targetMetadataInfo = targetMetadataInfoSupplierAction.get();
+ MetadataGetterParameter.GetterMetadataInfo sourceMetadataInfo = null;
+ if (sourceMetadataInfoSupplierAction != null) {
+ sourceMetadataInfo = sourceMetadataInfoSupplierAction.get();
}
- MetadataService metadataService = SpringBeanUtils.getBean(MetadataService.class);
- metadataService.deleteMetadata(metadataPath, metadataFileName);
+ return getMetadataWithEnvironment(targetMetadataInfo, sourceMetadataInfo, executeEnvironment, isInUpgradeTool);
}
- private List getRefResourceMetadataCollection(String formMetadataId, String formMetadataPath) {
- List resourceMetadataHeaderCollection = getRefResourceMetadataHeaderCollection(formMetadataId, formMetadataPath);
-
- // 获取资源元数据
- return getResourceMetadata(resourceMetadataHeaderCollection, formMetadataPath);
- }
-
- private List getRefResourceMetadataHeaderCollection(String formMetadataId, String formMetadataPath) {
- return this.getMetadataService().getResourceMetadata(formMetadataId, formMetadataPath);
- }
-
- private List getResourceMetadata(List resourceMetadataHeaderArrayList, String formMetadataPath) {
- if (resourceMetadataHeaderArrayList == null || resourceMetadataHeaderArrayList.size() == 0 || formMetadataPath == null || formMetadataPath.isEmpty()) {
+ public GspMetadata getMetadataWithEnvironment(Supplier targetMetadataInfoSupplierAction,
+ Supplier sourceMetadataInfoSupplierAction,
+ String customTargetMetadataNotFoundMessage,
+ ExecuteEnvironment executeEnvironment, boolean isInUpgradeTool) {
+ if (targetMetadataInfoSupplierAction == null) {
return null;
}
-
- ArrayList resourceMetadataArrayList = new ArrayList();
- for (MetadataHeader resourceMetadataHeader : resourceMetadataHeaderArrayList) {
- String resourceMetadataFileName = resourceMetadataHeader.getFileName();
- GspMetadata resourceMetadata = this.getMetadata(resourceMetadataFileName, formMetadataPath);
- if (resourceMetadata != null) {
- resourceMetadataArrayList.add(resourceMetadata);
- }
+ MetadataGetterParameter.GetterMetadataInfo targetMetadataInfo = targetMetadataInfoSupplierAction.get();
+ MetadataGetterParameter.GetterMetadataInfo sourceMetadataInfo = null;
+ if (sourceMetadataInfoSupplierAction != null) {
+ sourceMetadataInfo = sourceMetadataInfoSupplierAction.get();
}
-
- return resourceMetadataArrayList;
+ return getMetadataWithEnvironment(targetMetadataInfo, sourceMetadataInfo, customTargetMetadataNotFoundMessage, executeEnvironment, isInUpgradeTool);
}
/**
- * 根据元数据相对路径获取工程信息
+ * 运行时获取元数据接口方法
+ * 作为公共方法 会在别处进行使用 定义后不允许更改
*
- * @param metadataRelativePath
+ * @param metadataId
* @return
*/
- public MetadataProject getMetadataProject(String metadataRelativePath) {
- if (StringUtility.isNullOrEmpty(metadataRelativePath)) {
- return null;
- }
-
- return this.getMetadataProjectService().getMetadataProjInfo(metadataRelativePath);
+ public GspMetadata getMetadataWithRuntime(String metadataId) {
+ return MetadataUtilityWithRuntime.getMetadata(metadataId);
}
+
/**
- * 获取开发元数据绝对路径
+ * 根据元数据相对路径获取工程信息
*
- * @param relativePath
+ * @param metadataRelativePath
* @return
*/
- public String getAbsolutePath(String relativePath) {
- //开发根路径
- String devRootPath = ManagerUtils.getDevRootPath();
- if (relativePath.startsWith(devRootPath)) {
- return relativePath;
- }
-
- return Paths.get(devRootPath).resolve(relativePath).toString();
+ public MetadataProject getMetadataProject(String metadataRelativePath) {
+ return MetadataProjectUtility.getMetadataProject(metadataRelativePath);
}
/**
@@ -329,63 +263,24 @@ public final class MetadataUtility {
}
/**
- * 获取工程信息
+ * 获取开发元数据绝对路径
*
- * @param projectPath
+ * @param relativePath
* @return
*/
- private GspProject getProjectInformation(String projectPath) {
- try {
- return this.getGspProjectService().getGspProjectInfo(projectPath);
- } catch (IOException e) {
- WebLogger.Instance.error(e);
- return null;
+ public String getAbsolutePath(String relativePath) {
+ //开发根路径
+ String devRootPath = ManagerUtils.getDevRootPath();
+ if (relativePath.startsWith(devRootPath)) {
+ return relativePath;
}
- }
-
- /**
- * 从工程路径中获取工程名称,统一使用小写
- *
- * @param projectPath
- * @return
- */
- public String getProjectName(String projectPath) {
- GspProject currentProject = getProjectInformation(projectPath);
- return currentProject.getMetadataProjectName().toLowerCase();
- }
-
- /**
- * 元数据保存 如果元数据已经存在,则先进行删除旧的元数据文件
- *
- * @param metadata
- * @param deleteIfExists
- */
- public void saveMetadata(GspMetadata metadata) {
- MetadataService metadataService = SpringBeanUtils.getBean(MetadataService.class);
- metadataService.saveMetadata(metadata, Paths.get(metadata.getRelativePath()).resolve(metadata.getHeader().getFileName()).toString());
- }
- /**
- * 从工程路径中获取su路径,统一使用小写
- *
- * @param projectPath
- * @return
- */
- public String getServiceUnitPath(String projectPath) {
- GspProject currentProject = getProjectInformation(projectPath);
- return currentProject.getSuDeploymentPath().toLowerCase();
+ return FileUtility.combine(devRootPath, relativePath);
}
- public List getMetadataList(String spacePath, List metadataTypes) {
- return this.getMetadataService().getMetadataList(spacePath, metadataTypes);
- }
-
- public List getMetadataList(String spacePath) {
- return this.getMetadataService().getMetadataList(spacePath);
- }
// TODO:迁移到WebCommmand项目中
- public HashMap getReferenceComponentMetadata(GspMetadata commandMetadata, AfterGetReferenceWebComponentMetadata afterGetReferenceWebComponentMetadata, Object... parameterArray) {
+ public HashMap getReferenceComponentMetadata(GspMetadata commandMetadata, AfterGetReferenceWebComponentMetadataInvoker afterGetReferenceWebComponentMetadata, Object... parameterArray) {
if (commandMetadata == null) {
return null;
}
@@ -396,12 +291,12 @@ public final class MetadataUtility {
}
private void getReferenceWebComponentMetadata(GspMetadata commandMetadata, HashMap cmpList, List items,
- HashMap componentCacheList, AfterGetReferenceWebComponentMetadata afterGetReferenceWebComponentMetadata, Object... parameterArray) {
+ HashMap componentCacheList, AfterGetReferenceWebComponentMetadataInvoker afterGetReferenceWebComponentMetadata, Object... parameterArray) {
WebCommandsMetadata commandMetadataContent = null;
try {
commandMetadataContent = (WebCommandsMetadata) commandMetadata.getContent();
} catch (RuntimeException e) {
- throw new GSPException("Web_GetReferenceWebComponent", "当前元数据非命令元数据。元数据id是:" + commandMetadata.getHeader().getId());
+ throw new WebCustomException("当前元数据非命令元数据。元数据id是:" + commandMetadata.getHeader().getId());
}
if (commandMetadataContent == null) {
@@ -423,7 +318,7 @@ public final class MetadataUtility {
private void getReferenceWebComponentCommandItemList(GspMetadata commandMetadata, List commandItemList, HashMap componentMetadataCollection,
- HashMap componentCacheList, AfterGetReferenceWebComponentMetadata afterGetReferenceWebComponentMetadata, Object... parameterArray) {
+ HashMap componentCacheList, AfterGetReferenceWebComponentMetadataInvoker afterGetReferenceWebComponentMetadata, Object... parameterArray) {
if (commandItemList == null || commandItemList.size() == 0) {
return;
}
@@ -432,15 +327,10 @@ public final class MetadataUtility {
switch (item.getItemType()) {
case MethodRefer:
CmpMethodRefering methodReferingItem = (CmpMethodRefering) item;
- MetadataGetterParameter metadataGetterParameter = MetadataGetterParameter.getNewInstance(methodReferingItem.getComponentId(), commandMetadata.getRelativePath());
- metadataGetterParameter.setSourceMetadataId(commandMetadata.getHeader().getId());
- metadataGetterParameter.setSourceMetadataType(MetadataTypeEnum.Command);
- metadataGetterParameter.setSourceMetadataCode(commandMetadata.getHeader().getCode());
- metadataGetterParameter.setSourceMetadataPath(commandMetadata.getRelativePath());
- metadataGetterParameter.setSourceMetadataNameSpace(commandMetadata.getHeader().getNameSpace());
- metadataGetterParameter.setTargetMetadataType(MetadataTypeEnum.Component);
+ MetadataGetterParameter metadataGetterParameter = MetadataGetterParameter.getNewInstance(methodReferingItem.getComponentId(), commandMetadata.getRelativePath(), MetadataTypeEnum.Component);
+ metadataGetterParameter.setSourceMetadata(commandMetadata, MetadataTypeEnum.Command);
- GspMetadata webComponentMetadata = getMetadataInDesign(metadataGetterParameter);
+ GspMetadata webComponentMetadata = getMetadataWithDesign(metadataGetterParameter);
if (!componentMetadataCollection.containsKey(methodReferingItem.getComponentId())) {
if (componentCacheList != null && componentCacheList.containsKey(methodReferingItem.getComponentId())) {
@@ -449,7 +339,7 @@ public final class MetadataUtility {
} else {
WebComponentMetadata cmpMetadataContent = (WebComponentMetadata) webComponentMetadata.getContent();
if (cmpMetadataContent == null) {
- throw new GSPException("", String.format("标识为'%1$s'的服务构件为null。", methodReferingItem.getComponentId()));
+ throw new WebCustomException(String.format("标识为'%1$s'的服务构件为null。", methodReferingItem.getComponentId()));
}
@@ -494,18 +384,4 @@ public final class MetadataUtility {
}
return devRootPath;
}
-
- /**
- * 获取指定类型的元数据
- *
- * @param projectPath
- * @param metadataType
- * @return
- */
- public List getMetadataListInProject(String projectPath, String metadataType) {
- ArrayList searchedMetadataTypes = new ArrayList<>();
- searchedMetadataTypes.add(metadataType);
- return this.getMetadataService().getMetadataList(projectPath, searchedMetadataTypes);
- }
-
}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtilityWithDesign.java b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtilityWithDesign.java
new file mode 100644
index 0000000000000000000000000000000000000000..514e7d8db38255f285a86ebc2479930c0301f506
--- /dev/null
+++ b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtilityWithDesign.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.common.metadata;
+
+import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
+import com.inspur.edp.lcm.metadata.api.entity.uri.MetadataURI;
+import com.inspur.edp.lcm.metadata.api.service.MetadataService;
+import com.inspur.edp.lcm.metadata.api.service.RefCommonService;
+import com.inspur.edp.web.common.utility.StringUtility;
+import io.iec.edp.caf.commons.utils.SpringBeanUtils;
+
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 设计时元数据操作
+ *
+ * @author guozhiqi
+ */
+class MetadataUtilityWithDesign {
+ /**
+ * 获取指定工程路径下的元数据列表
+ * 如果传递的过滤元数据类型为空 那么不进行过滤
+ *
+ * @param spacePath
+ * @param metadataTypes
+ * @return
+ */
+ public static List getMetadataList(String spacePath, List metadataTypes) {
+ if (metadataTypes == null || metadataTypes.isEmpty()) {
+ return MetadataServiceInstance.get().getMetadataList(spacePath);
+ }
+ return MetadataServiceInstance.get().getMetadataList(spacePath, metadataTypes);
+ }
+
+ /**
+ * 获取指定类型的元数据
+ *
+ * @param projectPath
+ * @param metadataType
+ * @return
+ */
+ public static List getMetadataListInProject(String projectPath, String metadataType) {
+ ArrayList searchedMetadataTypes = new ArrayList<>();
+ searchedMetadataTypes.add(metadataType);
+ return MetadataServiceInstance.get().getMetadataList(projectPath, searchedMetadataTypes);
+ }
+
+ /**
+ * 根据元数据名称及元数据所在路径获取元数据信息。该方法不支持跨工程引用
+ *
+ * @param metadataFileName
+ * @param metadataPath
+ * @return
+ */
+ public static GspMetadata getMetadata(String metadataFileName, String metadataPath) {
+ if (StringUtility.isNullOrEmpty(metadataFileName) || StringUtility.isNullOrEmpty(metadataPath)) {
+ return null;
+ }
+
+ return MetadataServiceInstance.get().loadMetadata(metadataFileName, metadataPath);
+ }
+
+ /**
+ * 元数据保存 如果元数据已经存在,则先进行删除旧的元数据文件
+ *
+ * @param metadata
+ */
+ public static void saveMetadata(GspMetadata metadata) {
+ MetadataServiceInstance.get().saveMetadata(metadata, Paths.get(metadata.getRelativePath()).resolve(metadata.getHeader().getFileName()).toString());
+ }
+
+ /**
+ * 删除对应的元数据物理文件
+ *
+ * @param metadataPath 元数据所属路径
+ * @param metadataFileName 元数据对应的文件名称
+ */
+ public static void deleteMetadata(String metadataPath, String metadataFileName) {
+ if (StringUtility.isNullOrEmpty(metadataFileName)) {
+ return;
+ }
+
+ MetadataServiceInstance.get().deleteMetadata(metadataPath, metadataFileName);
+ }
+
+ /**
+ * 创建表单元数据 如果已经存在 不进行创建,否则进行元数据的创建
+ *
+ * @param metadata 待保存元数据
+ */
+ public static void createMetadataIfNotExists(GspMetadata metadata) {
+ MetadataService metadataService = MetadataServiceInstance.get();
+ // 元数据文件不存在时进行创建
+ if (!metadataService.isMetadataExist(metadata.getRelativePath(), metadata.getHeader().getFileName())) {
+ metadataService.createMetadata(metadata.getRelativePath(), metadata);
+ }
+ }
+
+ /**
+ * 判断指定路径 指定文件名称元数据是否存在
+ *
+ * @param spacePath
+ * @param metadataId
+ * @return
+ */
+ public static boolean isMetaDataExistsWithMetadataIDAndPath(String spacePath, String metadataId) {
+ return MetadataServiceInstance.get().isMetadataExistInProject(spacePath, metadataId);
+ }
+
+ /**
+ * 判断指定工程路径下指定的元数据文件是否存在
+ *
+ * @param metaDataPath 对应的元数据所在工程路径
+ * @param fileName 对应的元数据文件名称
+ * @return
+ */
+ public static boolean isMetaDataExistsWithMetadataPathAndFileName(String metaDataPath, String fileName) {
+ return MetadataServiceInstance.get().isMetadataExist(metaDataPath, fileName);
+ }
+
+ /**
+ * @param metadataGetterParameter
+ * @return
+ */
+ public static GspMetadata getMetadata(MetadataGetterParameter metadataGetterParameter) {
+ return getMetadata(metadataGetterParameter.getTargetMetadataUri(), metadataGetterParameter.getSourceMetadataUri(), metadataGetterParameter.getTargetMetadataInfo().getPath());
+ }
+
+ public static GspMetadata getMetadata(MetadataURI targetMetadataUri, MetadataURI sourceMetadataUri, String projectPath) {
+ return RefCommonServiceInstance.get().getRefMetadata(targetMetadataUri, sourceMetadataUri, projectPath);
+ }
+
+ /**
+ * 设计时元数据操作
+ * 设计时根据元数据路径和名称使用该服务
+ */
+ private static class MetadataServiceInstance {
+ public static MetadataService get() {
+ return SpringBeanUtils.getBean(MetadataService.class);
+ }
+ }
+
+ /**
+ * 设计时获取元数据
+ * 设计时根据元数据id获取使用该服务
+ */
+ private static class RefCommonServiceInstance {
+ public static RefCommonService get() {
+ return SpringBeanUtils.getBean(RefCommonService.class);
+ }
+ }
+}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtilityWithRuntime.java b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtilityWithRuntime.java
new file mode 100644
index 0000000000000000000000000000000000000000..e12cf862615ea620453cecda453d27df9f1db466
--- /dev/null
+++ b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtilityWithRuntime.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.common.metadata;
+
+import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
+import com.inspur.edp.metadata.rtcustomization.api.CustomizationService;
+import io.iec.edp.caf.commons.utils.SpringBeanUtils;
+
+/**
+ * 运行时元数据操作
+ *
+ * @author guozhiqi
+ */
+class MetadataUtilityWithRuntime {
+
+ /**
+ * 运行时依据元数据id获取对应的元数据信息
+ *
+ * @param metadataId
+ * @return
+ */
+ public static GspMetadata getMetadata(String metadataId) {
+ return CustomizationServiceInstance.get().getMetadata(metadataId);
+ }
+
+ /**
+ * 运行时元数据操作
+ */
+ private static class CustomizationServiceInstance {
+ public static CustomizationService get() {
+ return SpringBeanUtils.getBean(CustomizationService.class);
+ }
+ }
+}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtilityWithRuntimeRpc.java b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtilityWithRuntimeRpc.java
new file mode 100644
index 0000000000000000000000000000000000000000..161e2c9d88d31ce5f76e96984eafd7a00efa122e
--- /dev/null
+++ b/web-common/src/main/java/com/inspur/edp/web/common/metadata/MetadataUtilityWithRuntimeRpc.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.common.metadata;
+
+import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
+import com.inspur.edp.metadata.rtcustomization.serverapi.CustomizationServerService;
+import io.iec.edp.caf.commons.utils.SpringBeanUtils;
+
+/**
+ * 主要应用于升级工具中执行元数据的读取
+ * 此种情况下,可能存在对应的服务不存在的情况,因此需要针对性的进行处理
+ */
+class MetadataUtilityWithRuntimeRpc {
+ /**
+ * 判断是否存在对应的服务实例
+ *
+ * @return
+ */
+ public static boolean hasCustomizationServerServiceInstance() {
+ return CustomizationServerServiceInstance.get() != null;
+ }
+
+ /**
+ * 通过rpc调用获取对应的元数据服务
+ * 主要应用于分su场景下
+ *
+ * @param medaDataId
+ * @return
+ */
+ public static GspMetadata getMetadata(String medaDataId) {
+ return CustomizationServerServiceInstance.get().getMetadata(medaDataId);
+ }
+
+ /**
+ * 运行时元数据服务的rpc
+ */
+ private static class CustomizationServerServiceInstance {
+ public static CustomizationServerService get() {
+ return SpringBeanUtils.getBean(CustomizationServerService.class);
+ }
+ }
+}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/metadata/WebMetadataUri.java b/web-common/src/main/java/com/inspur/edp/web/common/metadata/WebMetadataUri.java
index 39948345a95b8f90be3491c51c81cc5904ac8b44..6fa79c9cf811117763a7a8736b2bab381764e3d2 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/metadata/WebMetadataUri.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/metadata/WebMetadataUri.java
@@ -19,6 +19,7 @@ package com.inspur.edp.web.common.metadata;
import com.inspur.edp.lcm.metadata.api.entity.uri.MetadataURI;
import com.inspur.edp.web.common.utility.StringUtility;
import lombok.Data;
+import org.springframework.util.StringUtils;
/**
* 继承 MetadataUri 主要目的是重写其中的输出方法
@@ -32,23 +33,28 @@ public class WebMetadataUri extends MetadataURI {
*/
private String customMetadataNotFoundMessage;
- public WebMetadataUri() {
- super();
- }
+ /**
+ * 是否使用默认的自定义提示信息
+ */
+ private boolean useCustomMetadataNotFoundMessage = false;
- public WebMetadataUri(String id) {
- super(id);
- }
+ /**
+ * 元数据关联名称
+ */
+ private String name;
- public WebMetadataUri(String id, String code, String type, String nameSpace) {
+ public WebMetadataUri(String id, String code, String name, String type, String nameSpace, String customMetadataNotFoundMessage) {
super(id, code, type, nameSpace);
+ this.customMetadataNotFoundMessage = customMetadataNotFoundMessage;
}
@Override
public String getURIDesc() {
- if (!StringUtility.isNullOrEmpty(this.getCustomMetadataNotFoundMessage())) {
+ // 如果强制使用自定义的异常提示 或者 code参数为空 且自定义异常提示信息不为空
+ if ((this.isUseCustomMetadataNotFoundMessage() || StringUtility.isNullOrEmpty(this.getCode())) && StringUtility.isNotNullOrEmpty(this.getCustomMetadataNotFoundMessage())) {
return this.getCustomMetadataNotFoundMessage();
}
+
return super.getURIDesc();
}
}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/utility/CommandLineUtility.java b/web-common/src/main/java/com/inspur/edp/web/common/utility/CommandLineUtility.java
index 5b92932ddfed450dc7e1d7056f0cd2488bd15dd1..79435354bf59894f32061f760b9a240684b10ae5 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/utility/CommandLineUtility.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/utility/CommandLineUtility.java
@@ -121,7 +121,6 @@ public class CommandLineUtility {
if (waitCode != 0) {
WebLogger.Instance.info("进程执行完毕", CommandLineUtility.class.getName());
}
- //process.destroy();
} catch (Exception e) {
WebLogger.Instance.error(e);
errorMessage = e.getMessage() + Arrays.toString(e.getStackTrace());
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/utility/DateUtility.java b/web-common/src/main/java/com/inspur/edp/web/common/utility/DateUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..5354d0035f7c8829ab2e361845c504ad51854ef9
--- /dev/null
+++ b/web-common/src/main/java/com/inspur/edp/web/common/utility/DateUtility.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.common.utility;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+
+/**
+ * 日期转换
+ *
+ * @author guozhiqi
+ */
+public class DateUtility {
+ /**
+ * 将LocalDateTime转换成为Date格式
+ *
+ * @param localDateTime
+ * @return
+ */
+ public static Date convertFromLocalDateTime(LocalDateTime localDateTime) {
+ Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+ return date;
+ }
+
+ /**
+ * 获取当前的默认时间 格式为 yyyy-MM-dd HH:mm:ss
+ *
+ * @return
+ */
+ public static String getCurrentDateTime() {
+ return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ }
+}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/utility/JsonNodeUtility.java b/web-common/src/main/java/com/inspur/edp/web/common/utility/JsonNodeUtility.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee33bfe17250ece13d53037cc898346ff0f0c8f2
--- /dev/null
+++ b/web-common/src/main/java/com/inspur/edp/web/common/utility/JsonNodeUtility.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.common.utility;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.JSONPath;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import java.util.function.Consumer;
+
+/**
+ * JsonNode function utility
+ *
+ * @author guozhiqi
+ */
+public class JsonNodeUtility {
+ /**
+ * 递归查找contents节点下的对应节点内容
+ *
+ * @param jsonArray
+ * @param functionAction
+ */
+ public static void rescureContents(JSONArray jsonArray, Consumer functionAction) {
+ rescureWithSpecificTag(jsonArray, "contents", functionAction);
+ }
+
+ /**
+ * 依据子节点标识进行递归
+ *
+ * @param jsonArray
+ * @param functionAction
+ */
+ public static void rescureWithSpecificTag(JSONArray jsonArray, String childTag, Consumer functionAction) {
+ if (jsonArray == null || jsonArray.size() == 0) {
+ return;
+ }
+ if (StringUtility.isNullOrEmpty(childTag)) {
+ childTag = "contents";
+ }
+ String finalChildTag = childTag;
+ jsonArray.forEach(jsonItem -> {
+ if (jsonItem instanceof JSONArray) {
+ JSONArray itemJsonArray = (JSONArray) jsonItem;
+ rescureContents(itemJsonArray, functionAction);
+ } else if (jsonItem instanceof JSONObject) {
+ JSONObject jsonObjectItem = (JSONObject) jsonItem;
+
+ // 执行回调
+ functionAction.accept(jsonObjectItem);
+
+ if (jsonObjectItem.get(finalChildTag) instanceof JSONArray) {
+ JSONArray contentsJsonArray = (JSONArray) jsonObjectItem.get(finalChildTag);
+ rescureContents(contentsJsonArray, functionAction);
+ }
+ }
+ });
+ }
+
+ /**
+ * 查找指定属性名称
+ * @param sourceNode
+ * @param attributeName
+ * @return
+ */
+ public static JSONArray findAll(JsonNode sourceNode, String attributeName) {
+ if (sourceNode == null || StringUtility.isNullOrEmpty(attributeName)) {
+ return new JSONArray();
+ }
+
+ return (JSONArray) JSONPath.extract(sourceNode.toString(), "$.." + attributeName);
+ }
+}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/utility/OperatingSystemUtility.java b/web-common/src/main/java/com/inspur/edp/web/common/utility/OperatingSystemUtility.java
index 29e17a2b5de9af182eb00e6288524419030314b0..281b08603d3b6d2e123c6cb1218c970794e893b6 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/utility/OperatingSystemUtility.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/utility/OperatingSystemUtility.java
@@ -37,6 +37,14 @@ public class OperatingSystemUtility {
return SystemUtils.IS_OS_LINUX;
}
+ /**
+ * 是否Mac OS
+ * @return
+ */
+ public static boolean isMac() {
+ return SystemUtils.IS_OS_MAC;
+ }
+
/**
* 判断当前运行操作系统 是否是windows
*
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/utility/RandomUtility.java b/web-common/src/main/java/com/inspur/edp/web/common/utility/RandomUtility.java
index f8c623e13b7af228a5c0bfb8ad3b5db37b3d5c6c..ea9f470ffe4fa10cf3064f989e4d1d86e4cbe95b 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/utility/RandomUtility.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/utility/RandomUtility.java
@@ -20,6 +20,7 @@ import java.util.UUID;
/**
* 随机数构造器
+ *
* @author guozhiqi
*/
public class RandomUtility {
@@ -34,4 +35,13 @@ public class RandomUtility {
public static String newGuid() {
return UUID.randomUUID().toString();
}
+
+ /**
+ * 指定长度的GUID
+ * @param length
+ * @return
+ */
+ public static String newGuid(int length) {
+ return UUID.randomUUID().toString().substring(0, length);
+ }
}
diff --git a/web-common/src/main/java/com/inspur/edp/web/common/utility/StringUtility.java b/web-common/src/main/java/com/inspur/edp/web/common/utility/StringUtility.java
index 85343bcb5c0c72aec9097f6cc640b947fa75d101..74bd4eaa88818c4d88ac23aaeeb57d6c9e1851a1 100644
--- a/web-common/src/main/java/com/inspur/edp/web/common/utility/StringUtility.java
+++ b/web-common/src/main/java/com/inspur/edp/web/common/utility/StringUtility.java
@@ -18,6 +18,8 @@ package com.inspur.edp.web.common.utility;
import org.apache.commons.lang3.StringUtils;
+import java.util.Arrays;
+import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.regex.Matcher;
@@ -213,6 +215,19 @@ public class StringUtility {
}
}
+ /**
+ * 使用默认值
+ * @param source
+ * @param defaultValue
+ * @return
+ */
+ public static String getOrDefault(String source, String defaultValue) {
+ if (isNullOrEmpty(source)) {
+ return isNullOrEmpty(defaultValue) ? "" : defaultValue;
+ }
+ return source;
+ }
+
/**
* 将null 转换成空字符串
*
@@ -374,4 +389,25 @@ public class StringUtility {
c = Character.toLowerCase(c);
return c;
}
+
+ /**
+ * 移除字符串两端指定的字符
+ *
+ * @param source
+ * @param beTrim
+ * @return
+ */
+ public static String trimStringWith(String source, List beTrim) {
+ int st = 0;
+ int len = source.length();
+ char[] val = source.toCharArray();
+
+ while ((st < len) && (beTrim.contains(val[st]))) {
+ st++;
+ }
+ while ((st < len) && (beTrim.contains(val[len - 1]))) {
+ len--;
+ }
+ return ((st > 0) || (len < source.length())) ? source.substring(st, len) : source;
+ }
}
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 469aa290b6b8bbd253b7aba6c9c55afa11be8662..7c3bc9ea47b08e51b8bdd3580550ad212e22909a 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
@@ -25,6 +25,17 @@ public class FileUtilityTest {
Assert.assertTrue(FileUtility.isSameFile(sourceFile, targetFile));
}
+ /**
+ * 判断文件权限
+ */
+ @Test
+ public void testPermission() {
+ String sourceFile = "D:\\InspurCode\\N转J之后代码\\npm安装\\web\\web-common\\src\\test\\java\\com\\inspur\\edp\\web\\common\\io\\sourcefile\\package.json";
+ File file = new File(sourceFile);
+ System.out.println(file.canRead());
+ System.out.println(file.canWrite());
+ }
+
@Test
public void testGetCurrentWorkPath() {
String path = FileUtility.getCurrentWorkPath(true);
diff --git a/web-common/src/test/java/com/inspur/edp/web/common/utility/RandomUtilityTest.java b/web-common/src/test/java/com/inspur/edp/web/common/utility/RandomUtilityTest.java
index c860cc0dc5371f8254675ce473cfacd09d4139ee..8857740066203108a91f8077024a674d9815796f 100644
--- a/web-common/src/test/java/com/inspur/edp/web/common/utility/RandomUtilityTest.java
+++ b/web-common/src/test/java/com/inspur/edp/web/common/utility/RandomUtilityTest.java
@@ -8,8 +8,17 @@ public class RandomUtilityTest {
@Test
public void testUUID() {
String result = RandomUtility.newGuid();
- assertEquals(result.length(),36);
+ assertEquals(result.length(), 36);
System.out.println(result);
System.out.println(result.length());
}
+
+ @Test
+ public void newGuid() {
+ System.out.println(RandomUtility.newGuid(4));
+ }
+
+ @Test
+ public void testNewGuid() {
+ }
}
\ No newline at end of file
diff --git a/web-common/src/test/java/com/inspur/edp/web/common/utility/StringUtilityTest.java b/web-common/src/test/java/com/inspur/edp/web/common/utility/StringUtilityTest.java
index 95cd34e9d788cdc8c0a74d15e41c1de844a7619f..18bdd110865a8465addacc55394334e54220afa7 100644
--- a/web-common/src/test/java/com/inspur/edp/web/common/utility/StringUtilityTest.java
+++ b/web-common/src/test/java/com/inspur/edp/web/common/utility/StringUtilityTest.java
@@ -1,7 +1,10 @@
package com.inspur.edp.web.common.utility;
+import org.junit.Assert;
import org.junit.Test;
+import java.util.Arrays;
+
import static org.junit.Assert.*;
public class StringUtilityTest {
@@ -41,5 +44,12 @@ public class StringUtilityTest {
}
+ @Test
+ public void testTrim() {
+ String source = "'\"fdfdfdfdf\'fdfdfdf\"'";
+ String result = StringUtility.trimStringWith(source, Arrays.asList('\''));
+ Assert.assertEquals(result, "fdfdfdfdf\'fdfdfdf");
+ }
+
}
\ No newline at end of file
diff --git a/web-designschema/src/main/java/com/inspur/edp/web/designschema/elements/Schema.java b/web-designschema/src/main/java/com/inspur/edp/web/designschema/elements/Schema.java
index 85f8395c829e5391f9ac11e26be64a564933c5e5..251a1f3d57554d06fd93e6abfadbe9f636b9f3c2 100644
--- a/web-designschema/src/main/java/com/inspur/edp/web/designschema/elements/Schema.java
+++ b/web-designschema/src/main/java/com/inspur/edp/web/designschema/elements/Schema.java
@@ -23,6 +23,7 @@ import java.util.*;
/**
* 表单Schema元素
+ * @author guozhiqi
*/
@Data
public class Schema {
diff --git a/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/EntityBuilder.java b/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/EntityBuilder.java
index 7ef61a64900746f14d1d088c039b326dbcddc6b9..57d585575ad7c52dfff433832b74cdaad45b9841 100644
--- a/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/EntityBuilder.java
+++ b/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/EntityBuilder.java
@@ -19,7 +19,7 @@ package com.inspur.edp.web.designschema.generator;
import com.inspur.edp.das.commonmodel.IGspCommonObject;
import com.inspur.edp.formserver.viewmodel.GspViewModelElement;
import com.inspur.edp.udt.designtime.api.entity.SimpleDataTypeDef;
-import com.inspur.edp.web.common.GSPException;
+import com.inspur.edp.web.common.customexception.WebCustomException;
import com.inspur.edp.web.common.utility.StringUtility;
import com.inspur.edp.web.designschema.elements.Entity;
import com.inspur.edp.web.designschema.elements.Field;
@@ -97,7 +97,7 @@ public class EntityBuilder {
private void VerifyViewObject(IGspCommonObject viewObject) {
if (viewObject.getIDElement() == null) {
- throw new GSPException("", String.format("标识为'%1$s'的视图对象'%2$s'的IDElement属性不允许为null。", viewObject, viewObject.getName()));
+ throw new WebCustomException(String.format("标识为'%1$s'的视图对象'%2$s'的IDElement属性不允许为null。", viewObject, viewObject.getName()));
}
}
}
diff --git a/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/FieldBuilder.java b/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/FieldBuilder.java
index 5cf30dd0072105c6a4f5602e82702d7a53f59da5..64fc0c35d166ad9e370e38f53a79779c688610f5 100644
--- a/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/FieldBuilder.java
+++ b/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/FieldBuilder.java
@@ -26,13 +26,12 @@ import com.inspur.edp.cef.designtime.api.element.GspAssociation;
import com.inspur.edp.cef.designtime.api.element.GspElementObjectType;
import com.inspur.edp.formserver.viewmodel.GspViewModelElement;
import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
-import com.inspur.edp.lcm.metadata.api.service.RefCommonService;
-import com.inspur.edp.metadata.rtcustomization.api.CustomizationService;
import com.inspur.edp.udt.designtime.api.entity.SimpleDataTypeDef;
import com.inspur.edp.udt.designtime.api.nocode.BusinessField;
import com.inspur.edp.udt.designtime.api.nocode.IBusinessFieldService;
import com.inspur.edp.web.common.environment.ExecuteEnvironment;
import com.inspur.edp.web.common.metadata.MetadataGetterParameter;
+import com.inspur.edp.web.common.metadata.MetadataTypeEnum;
import com.inspur.edp.web.common.metadata.MetadataUtility;
import com.inspur.edp.web.common.utility.StringUtility;
import com.inspur.edp.web.designschema.elements.ComplexField;
@@ -470,7 +469,6 @@ public class FieldBuilder {
objCode = belongedElement.getBelongObject().getCode();
}
if (StringUtils.isEmpty(objCode)) {
- System.out.println("belonged element is null");
return;
}
// String objectCode = belongedElement.getBelongObject().getCode();
@@ -639,11 +637,15 @@ public class FieldBuilder {
private GspMetadata getMetadata(String id, boolean isRuntime) {
if (isRuntime) {
- return MetadataUtility.getInstance().getMetadataWithEnvironment(id, ExecuteEnvironment.Runtime, false);
+ return MetadataUtility.getInstance().getMetadataWithEnvironment(() -> {
+ MetadataGetterParameter.GetterMetadataInfo getterMetadataInfo = new MetadataGetterParameter.GetterMetadataInfo();
+ getterMetadataInfo.setId(id);
+ return getterMetadataInfo;
+ }, null, ExecuteEnvironment.Runtime, false);
} else {
- MetadataGetterParameter metadataGetterParameter = MetadataGetterParameter.getNewInstance(id, null);
+ MetadataGetterParameter metadataGetterParameter = MetadataGetterParameter.getNewInstance(id, null, MetadataTypeEnum.ViewModel);
metadataGetterParameter.setTargetMetadataNotFoundMessage("更新表单schema,关联字段元数据找不到,请修正。对应字段元数据id为:" + id);
- return MetadataUtility.getInstance().getMetadataInDesign(metadataGetterParameter);
+ return MetadataUtility.getInstance().getMetadataWithDesign(metadataGetterParameter);
}
}
}
diff --git a/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/FieldTypeBuilder.java b/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/FieldTypeBuilder.java
index 01774fc7d8feca8dd2691e7f4f254449bf65f439..539010ab2b8cdec44deb7446ba53f5b779127fb0 100644
--- a/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/FieldTypeBuilder.java
+++ b/web-designschema/src/main/java/com/inspur/edp/web/designschema/generator/FieldTypeBuilder.java
@@ -28,6 +28,7 @@ import com.inspur.edp.udt.designtime.api.entity.UnifiedDataTypeDef;
import com.inspur.edp.udt.designtime.api.nocode.BusinessField;
import com.inspur.edp.udt.designtime.api.nocode.IBusinessFieldService;
import com.inspur.edp.web.common.metadata.MetadataGetterParameter;
+import com.inspur.edp.web.common.metadata.MetadataTypeEnum;
import com.inspur.edp.web.common.metadata.MetadataUtility;
import com.inspur.edp.web.designschema.elements.Field;
import com.inspur.edp.web.designschema.elements.SimpleField;
@@ -230,9 +231,9 @@ public class FieldTypeBuilder {
CustomizationService customizationService = SpringBeanUtils.getBean(CustomizationService.class);
typeMetadata = customizationService.getMetadata(uri);
} else {
- MetadataGetterParameter metadataGetterParameter = MetadataGetterParameter.getNewInstance(uri, null);
+ MetadataGetterParameter metadataGetterParameter = MetadataGetterParameter.getNewInstance(uri, null, MetadataTypeEnum.ViewModel);
metadataGetterParameter.setTargetMetadataNotFoundMessage("更新表单Schema,获取UDT字段元数据失败,元数据不存在。对应元数据id为:" + uri);
- typeMetadata = MetadataUtility.getInstance().getMetadataInDesign(metadataGetterParameter);
+ typeMetadata = MetadataUtility.getInstance().getMetadataWithDesign(metadataGetterParameter);
}
if (typeMetadata == null) {
throw new RuntimeException(String.format("未获取到id为'%1$s'的统一数据类型(UDT)元数据。", uri));
diff --git a/web-designschema/src/main/java/com/inspur/edp/web/designschema/synchronization/FormMetadataUpdate.java b/web-designschema/src/main/java/com/inspur/edp/web/designschema/synchronization/FormMetadataUpdate.java
index 7cef47cb09fee7b79b300d6668bfdaa2c4f217af..9a980cfee37d0fc973307aac5e4622d45dc6c269 100644
--- a/web-designschema/src/main/java/com/inspur/edp/web/designschema/synchronization/FormMetadataUpdate.java
+++ b/web-designschema/src/main/java/com/inspur/edp/web/designschema/synchronization/FormMetadataUpdate.java
@@ -21,7 +21,6 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.inspur.edp.formserver.viewmodel.GspViewModel;
import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
import com.inspur.edp.lcm.metadata.api.service.MetadataService;
-import com.inspur.edp.web.common.environment.ExecuteEnvironment;
import com.inspur.edp.web.common.metadata.MetadataGetterParameter;
import com.inspur.edp.web.common.metadata.MetadataTypeEnum;
import com.inspur.edp.web.common.metadata.MetadataUtility;
@@ -58,9 +57,9 @@ public class FormMetadataUpdate {
Synchronizer synchronizer = new Synchronizer();
for (Schema schema : schemaList) {
if ("vo".equals(schema.getSourceType())) {
- MetadataGetterParameter metadataGetterParameter = MetadataGetterParameter.getNewInstance(schema.getId(), null);
- metadataGetterParameter.setTargetMetadataNotFoundMessage("根据表单元数据获取VO元数据为空,请检查表单元数据module>schemas>id 是否正确,此参数对应VO元数据id参数");
- GspMetadata metadata = MetadataUtility.getInstance().getMetadataInDesign(metadataGetterParameter);
+ MetadataGetterParameter metadataGetterParameter = MetadataGetterParameter.getNewInstance(schema.getId(), null, MetadataTypeEnum.ViewModel);
+ metadataGetterParameter.setTargetMetadataNotFoundMessage("根据表单元数据获取VO元数据为空,请检查表单元数据module>schemas>id 是否正确,此参数为表单对应VO元数据id参数!");
+ GspMetadata metadata = MetadataUtility.getInstance().getMetadataWithDesign(metadataGetterParameter);
GspViewModel viewObject = (GspViewModel) ((metadata.getContent() instanceof GspViewModel) ? metadata.getContent() : null);
metadata.setContent(synchronizer.synchronize(formObject, schema, viewObject));
diff --git a/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java b/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java
index c98a13d4660af7cb8ed1d2d573c29d612a5393c1..18362e50f6fe7cdcbb43d9fdad2885b9e289a137 100644
--- a/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java
+++ b/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java
@@ -19,6 +19,7 @@ package com.inspur.edp.web.designschema.webservice;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.inspur.edp.formserver.viewmodel.GspViewModel;
+import com.inspur.edp.web.common.logger.WebLogger;
import com.inspur.edp.web.common.serialize.SerializeUtility;
import com.inspur.edp.web.designschema.api.webservice.DesignSchemaWebService;
import com.inspur.edp.web.designschema.elements.Schema;
@@ -63,7 +64,7 @@ public class DesignSchemaWebServiceImpl implements DesignSchemaWebService {
return SerializeUtility.getInstance().valueToJson(schema, PropertyNamingStrategy.LOWER_CAMEL_CASE).toString();
} catch (Exception ex) {
- System.out.println(ex.getMessage() + Arrays.toString(ex.getStackTrace()));
+ WebLogger.Instance.error(ex, DesignSchemaWebServiceImpl.class.getName());
}
return "";
}
diff --git a/web-dynamic-form-api/pom.xml b/web-dynamic-form-api/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..48e41c2d70323dd6defbc891cd56bc1b7a195668
--- /dev/null
+++ b/web-dynamic-form-api/pom.xml
@@ -0,0 +1,37 @@
+
+
+
+
+ 4.0.0
+
+ com.inspur.edp
+ web
+ ${custom.version}
+
+
+ web-dynamicform-api
+
+
+
+ com.inspur.edp
+ web-jitengine-common
+
+
+
+
\ No newline at end of file
diff --git a/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/customexception/DynamicFormException.java b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/customexception/DynamicFormException.java
new file mode 100644
index 0000000000000000000000000000000000000000..86081850f92141b5e7e223581ebad1320b4ca522
--- /dev/null
+++ b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/customexception/DynamicFormException.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.dynamicform.core.api.customexception;
+
+/**
+ * 自定义异常定义
+ * @author guozhiqi
+ */
+public class DynamicFormException extends RuntimeException {
+ public DynamicFormException(String errorMessage) {
+ super(errorMessage);
+ }
+
+ public DynamicFormException(String errorMessage, Throwable innerException) {
+ super(errorMessage, innerException);
+ }
+
+}
diff --git a/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/DynamicCreateFormMetadataParameter.java b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/DynamicCreateFormMetadataParameter.java
new file mode 100644
index 0000000000000000000000000000000000000000..662b3d0e617bafb5fb714ac3f868cd4923655d98
--- /dev/null
+++ b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/DynamicCreateFormMetadataParameter.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.dynamicform.core.api.entity;
+
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 动态创建表单元数据参数
+ *
+ * @author guozhiqi
+ */
+@Data
+public class DynamicCreateFormMetadataParameter {
+ /**
+ * 工程路径 应该为相对路径,通过补充工作空间路径来构造称为绝对路径
+ */
+ private String projectPath;
+ /**
+ * 工程对应code参数值
+ */
+ private String projectCode;
+
+ /**
+ * 工程所属namespace
+ */
+ private String projectNameSpace;
+
+ /**
+ * 业务对象id
+ */
+ private String bizobjectID;
+
+
+
+
+
+ /**
+ * 关联的表单信息列表 主要用于标识待创建的表单及其关联的模板信息
+ */
+ private List formMetadataInfoList = new ArrayList<>();
+
+
+}
diff --git a/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/DynamicFormCreateEntity.java b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/DynamicFormCreateEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..76f4f2b32ec395a26b4beef0cac4b97457575e54
--- /dev/null
+++ b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/DynamicFormCreateEntity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.dynamicform.core.api.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class DynamicFormCreateEntity implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private String bizObjectId;
+
+ private String eapiMetadataId;
+
+ private String eapiSourceUri;
+
+ private String voMetadataId;
+
+
+}
diff --git a/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/FormMetadataInfo.java b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/FormMetadataInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..3abae3ef770fc2ced3d2155b58621a45d6a53cf7
--- /dev/null
+++ b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/FormMetadataInfo.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.dynamicform.core.api.entity;
+
+import com.inspur.edp.web.common.utility.StringUtility;
+import lombok.Data;
+
+/**
+ * 关联的表单元数据信息
+ *
+ * @author guozhiqi
+ */
+public class FormMetadataInfo {
+
+ /**
+ * 待创建表单的code参数
+ */
+ private String code;
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+
+ /**
+ * eapi 元数据id
+ */
+ private String eapiMetadataId;
+
+ /**
+ * eapi 暴露的uri地址
+ */
+ private String eapiSourceUri;
+
+ /**
+ * eapi元数据code参数值
+ */
+ private String eapiMetadataCode;
+
+ /**
+ * eapi 元数据name参数值
+ */
+ private String eapiMetadataName;
+
+ /**
+ * vo元数据id
+ */
+ private String voMetadataId;
+
+ /**
+ * vo元数据code参数值
+ */
+ private String voMetadataCode;
+ /**
+ * vo元数据name参数值
+ */
+ private String voMetadataName;
+
+ public String getEapiMetadataId() {
+ return eapiMetadataId;
+ }
+
+ public void setEapiMetadataId(String eapiMetadataId) {
+ this.eapiMetadataId = eapiMetadataId;
+ }
+
+ public String getEapiSourceUri() {
+ return eapiSourceUri;
+ }
+
+ public void setEapiSourceUri(String eapiSourceUri) {
+ this.eapiSourceUri = eapiSourceUri;
+ }
+
+ public String getEapiMetadataCode() {
+ return eapiMetadataCode;
+ }
+
+ public void setEapiMetadataCode(String eapiMetadataCode) {
+ this.eapiMetadataCode = eapiMetadataCode;
+ }
+
+ public String getEapiMetadataName() {
+ return eapiMetadataName;
+ }
+
+ public void setEapiMetadataName(String eapiMetadataName) {
+ this.eapiMetadataName = eapiMetadataName;
+ }
+
+ public String getVoMetadataId() {
+ return voMetadataId;
+ }
+
+ public void setVoMetadataId(String voMetadataId) {
+ this.voMetadataId = voMetadataId;
+ }
+
+ public String getVoMetadataCode() {
+ return voMetadataCode;
+ }
+
+ public void setVoMetadataCode(String voMetadataCode) {
+ this.voMetadataCode = voMetadataCode;
+ }
+
+ public String getVoMetadataName() {
+ return voMetadataName;
+ }
+
+ public void setVoMetadataName(String voMetadataName) {
+ this.voMetadataName = voMetadataName;
+ }
+
+ /**
+ * 待创建表单的name参数值
+ */
+ private String name;
+
+ public String getName() {
+ if (StringUtility.isNullOrEmpty(this.name)) {
+ return this.getCode();
+ }
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * 关联的表单模板信息
+ */
+ private FormMetadataTemplateInfo templateInfo;
+
+ public FormMetadataTemplateInfo getTemplateInfo() {
+ return templateInfo;
+ }
+
+ public void setTemplateInfo(FormMetadataTemplateInfo templateInfo) {
+ this.templateInfo = templateInfo;
+ }
+}
diff --git a/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/FormMetadataTemplateInfo.java b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/FormMetadataTemplateInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..593b9d823868011ecf16705c4a74d8e0dbad1a8e
--- /dev/null
+++ b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/entity/FormMetadataTemplateInfo.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.dynamicform.core.api.entity;
+
+import lombok.Data;
+
+import java.util.Objects;
+
+/**
+ * 表单关联的模板信息
+ *
+ * @author guozhiqi
+ */
+@Data
+public class FormMetadataTemplateInfo {
+ /**
+ * 关联的表单模板id 此用来使用固定的模板参数
+ */
+ private String templateId;
+ /**
+ * 关联的表单模板code 此参数主要用于标识
+ */
+ private String templateCode;
+
+ /**
+ * 关联的表单模板name 此参数主要用于标识
+ */
+ private String templateName;
+
+ /**
+ * 是否使用列表模板
+ *
+ * @return
+ */
+ public boolean isListTemplate() {
+ return Objects.equals(this.templateId, "new-list-template");
+ }
+
+ /**
+ * 是否卡片模板
+ * @return
+ */
+ public boolean isNewCardTemplate() {
+ return Objects.equals(this.templateId, "new-card-template");
+ }
+}
diff --git a/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/service/DynamicCreateFormMetadataService.java b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/service/DynamicCreateFormMetadataService.java
similarity index 86%
rename from web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/service/DynamicCreateFormMetadataService.java
rename to web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/service/DynamicCreateFormMetadataService.java
index d5eb32838179295f1ff74b93b67e122be1e86e6d..7763bbad504be80d427e6eb758359fae46a526fa 100644
--- a/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/service/DynamicCreateFormMetadataService.java
+++ b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/service/DynamicCreateFormMetadataService.java
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-package com.inspur.edp.web.designschema.api.service;
+package com.inspur.edp.web.dynamicform.core.api.service;
import com.inspur.edp.web.common.entity.ResultMessage;
-import com.inspur.edp.web.designschema.api.entity.DynamicCreateFormMetadataParameter;
+import com.inspur.edp.web.dynamicform.core.api.entity.DynamicCreateFormMetadataParameter;
/**
* 动态创建表单元数据
@@ -27,6 +27,7 @@ import com.inspur.edp.web.designschema.api.entity.DynamicCreateFormMetadataParam
public interface DynamicCreateFormMetadataService {
/**
* 动态创建表单
+ *
* @param parameter 入参
* @return
*/
diff --git a/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/webservice/DynamicFormWebService.java b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/webservice/DynamicFormWebService.java
new file mode 100644
index 0000000000000000000000000000000000000000..74c6b2cb1ca8e0aed541f2e0331ad86bbc85f479
--- /dev/null
+++ b/web-dynamic-form-api/src/main/java/com/inspur/edp/web/dynamicform/core/api/webservice/DynamicFormWebService.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.dynamicform.core.api.webservice;
+
+import com.inspur.edp.web.common.entity.ResultMessage;
+import com.inspur.edp.web.dynamicform.core.api.entity.DynamicFormCreateEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.MediaType;
+
+/**
+ * 动态创建表单web服务
+ *
+ * @author guozhiqi
+ */
+@Path("/")
+public interface DynamicFormWebService {
+
+ /**
+ * 动态创建表单元数据 接口地址
+ *
+ * @return
+ */
+ @POST
+ @Path("/createform")
+ @Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
+ ResultMessage create(@RequestBody DynamicFormCreateEntity createEntity);
+}
diff --git a/web-dynamic-form-core/pom.xml b/web-dynamic-form-core/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fbac82138388294cb545d0cb5b801f12c67a981c
--- /dev/null
+++ b/web-dynamic-form-core/pom.xml
@@ -0,0 +1,53 @@
+
+
+
+
+ 4.0.0
+
+ com.inspur.edp
+ web
+ ${custom.version}
+
+
+ web-dynamicform-core
+
+
+
+ com.inspur.edp
+ web-dynamicform-api
+
+
+ com.inspur.edp
+ web-designschema
+
+
+ com.inspur.edp
+ web-jitengine-formmetadata
+
+
+ com.inspur.edp
+ web-statemachine-metadata
+
+
+ com.inspur.edp
+ web-pageflow-metadata
+
+
+
+
\ No newline at end of file
diff --git a/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/CardTemplateEditorGenerator.java b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/CardTemplateEditorGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..6201cad5f1f4ab3f067d622848d2015890d635e0
--- /dev/null
+++ b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/CardTemplateEditorGenerator.java
@@ -0,0 +1,275 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.dynamicform.core.components;
+
+import java.util.HashMap;
+
+/**
+ * card 模板 编辑器构造
+ */
+public class CardTemplateEditorGenerator {
+
+ public static HashMap generateWithEditorType(String editorType) {
+ HashMap editorHashMap = new HashMap<>();
+ switch (editorType) {
+ case "ContentContainer":
+ editorHashMap.put("id", "container");
+ editorHashMap.put("type", "ContentContainer");
+ break;
+ case "ButtonGroup":
+ editorHashMap.put("id", "ButtonGroup");
+ editorHashMap.put("type", "ButtonGroup");
+ editorHashMap.put("appearance", "{class:\"btn-toolbar my-1 mx-2\"}");
+ break;
+ case "Button":
+ editorHashMap.put("id", "button");
+ editorHashMap.put("type", "Button");
+ editorHashMap.put("text", "");
+ editorHashMap.put("seperate", true);
+ editorHashMap.put("textAligment", "center");
+ editorHashMap.put("visible", true);
+ editorHashMap.put("dataSourceType", "static");
+ break;
+ case "TextBox":
+ editorHashMap.put("id", "textbox1");
+ editorHashMap.put("type", "TextBox");
+ editorHashMap.put("titleSourceType", "static");
+ editorHashMap.put("title", "文本");
+ editorHashMap.put("readonly", false);
+ editorHashMap.put("require", false);
+ editorHashMap.put("disable", false);
+ editorHashMap.put("placeHolder", "");
+ editorHashMap.put("linkedLabelEnabled", false);
+ editorHashMap.put("visible", true);
+ editorHashMap.put("holdPlace", false);
+ editorHashMap.put("isTextArea", true);
+ editorHashMap.put("isPassword", false);
+ editorHashMap.put("hasDefaultFocus", false);
+ editorHashMap.put("enableTips", true);
+ break;
+ case "MultiTextBox":
+ editorHashMap.put("id", "multiTextBox1");
+ editorHashMap.put("type", "MultiTextBox");
+ editorHashMap.put("titleSourceType", "static");
+ editorHashMap.put("title", "多行文本框");
+ editorHashMap.put("readonly", false);
+ editorHashMap.put("require", false);
+ editorHashMap.put("disable", false);
+ editorHashMap.put("placeHolder", "");
+ editorHashMap.put("linkedLabelEnabled", false);
+ editorHashMap.put("visible", true);
+ editorHashMap.put("holdPlace", false);
+ editorHashMap.put("isTextArea", true);
+ editorHashMap.put("hasDefaultFocus", false);
+ editorHashMap.put("enableTips", true);
+ editorHashMap.put("autoHeight", false);
+ break;
+ case "NumericBox":
+ editorHashMap.put("id", "numericBox1");
+ editorHashMap.put("type", "NumericBox");
+ editorHashMap.put("titleSourceType", "static");
+ editorHashMap.put("title", "数值框");
+ editorHashMap.put("controlSource", "Farris");
+ editorHashMap.put("readonly", false);
+ editorHashMap.put("require", false);
+ editorHashMap.put("disable", false);
+ editorHashMap.put("placeHolder", "");
+ editorHashMap.put("textAlign", "left");
+ editorHashMap.put("precisionSourceType", "static");
+ editorHashMap.put("step", 1);
+ editorHashMap.put("useThousands", true);
+ editorHashMap.put("bigNumber", false);
+ editorHashMap.put("holdPlace", false);
+ editorHashMap.put("linkedLabelEnabled", false);
+ editorHashMap.put("visible", false);
+ editorHashMap.put("isTextArea", true);
+ editorHashMap.put("hasDefaultFocus", false);
+ editorHashMap.put("showZero", true);
+ editorHashMap.put("showButton", true);
+
+ break;
+ case "DateBox":
+ editorHashMap.put("id", "date");
+ editorHashMap.put("type", "DateBox");
+ editorHashMap.put("titleSourceType", "static");
+ editorHashMap.put("title", "日期选择");
+ editorHashMap.put("controlSource", "Farris");
+ editorHashMap.put("readonly", false);
+ editorHashMap.put("require", false);
+ editorHashMap.put("disable", false);
+ editorHashMap.put("editable", true);
+ editorHashMap.put("dateRange", false);
+ editorHashMap.put("showTime", false);
+ editorHashMap.put("showType", 1);
+ editorHashMap.put("dateFormat", "yyyy-MM-dd");
+ editorHashMap.put("returnFormat", "yyyy-MM-dd");
+ editorHashMap.put("showWeekNumbers", false);
+ editorHashMap.put("dateRangeDatesDelimiter", "~");
+ editorHashMap.put("useDefault", false);
+ editorHashMap.put("placeHolder", "");
+ editorHashMap.put("textAlign", "left");
+ editorHashMap.put("precisionSourceType", "static");
+ editorHashMap.put("step", 1);
+ editorHashMap.put("useThousands", true);
+ editorHashMap.put("bigNumber", false);
+ editorHashMap.put("holdPlace", false);
+ editorHashMap.put("linkedLabelEnabled", false);
+ editorHashMap.put("visible", false);
+ editorHashMap.put("isTextArea", true);
+ editorHashMap.put("hasDefaultFocus", false);
+ editorHashMap.put("localization", false);
+ break;
+ case "CheckBox":
+ editorHashMap.put("id", "checkBox1");
+ editorHashMap.put("type", "CheckBox");
+ editorHashMap.put("titleSourceType", "static");
+ editorHashMap.put("title", "复选框");
+ editorHashMap.put("checked", false);
+ editorHashMap.put("readonly", false);
+ editorHashMap.put("require", false);
+ editorHashMap.put("disable", false);
+ editorHashMap.put("visible", true);
+ editorHashMap.put("linkedLabelEnabled", false);
+ editorHashMap.put("holdPlace", false);
+ editorHashMap.put("hasDefaultFocus", false);
+ break;
+ case "EnumField":
+ editorHashMap.put("id", "");
+ editorHashMap.put("type", "EnumField");
+ editorHashMap.put("titleSourceType", "static");
+ editorHashMap.put("title", "下拉框");
+ editorHashMap.put("controlSource", "Farris");
+ editorHashMap.put("placeHolder", "");
+ editorHashMap.put("readonly", false);
+ editorHashMap.put("require", false);
+ editorHashMap.put("disable", false);
+ editorHashMap.put("holdPlace", false);
+ editorHashMap.put("isTextArea", true);
+ editorHashMap.put("linkedLabelEnabled", false);
+ editorHashMap.put("visible", true);
+ editorHashMap.put("hasDefaultFocus", false);
+ editorHashMap.put("idField", "");
+ editorHashMap.put("textField", "");
+ editorHashMap.put("multiSelect", false);
+ editorHashMap.put("uri", "");
+ editorHashMap.put("autoWidth", true);
+ editorHashMap.put("enableClear", true);
+ editorHashMap.put("enableCancelSelected", false);
+ editorHashMap.put("dataSourceType", "static");
+ break;
+ case "RadioGroup":
+ editorHashMap.put("id", "radioGroup1");
+ editorHashMap.put("type", "RadioGroup");
+ editorHashMap.put("titleSourceType", "static");
+ editorHashMap.put("title", "单选组");
+ editorHashMap.put("isHorizontal", true);
+ editorHashMap.put("readonly", false);
+ editorHashMap.put("require", false);
+ editorHashMap.put("disable", false);
+ editorHashMap.put("linkedLabelEnabled", false);
+ editorHashMap.put("visible", true);
+ editorHashMap.put("holdPlace", false);
+ editorHashMap.put("dataSourceType", "static");
+ editorHashMap.put("textField", "name");
+ editorHashMap.put("valueField", "value");
+
+ break;
+ case "Tab":
+ editorHashMap.put("id", "tab1");
+ editorHashMap.put("type", "Tab");
+ editorHashMap.put("controlSource", "Farris");
+ editorHashMap.put("position", "top");
+ editorHashMap.put("contentFill", false);
+ editorHashMap.put("autoTitleWidth", false);
+ editorHashMap.put("titleWidth", 0);
+ break;
+ case "TabPage":
+ editorHashMap.put("id", "tabPage1");
+ editorHashMap.put("type", "TabPage");
+ editorHashMap.put("controlSource", "Farris");
+ editorHashMap.put("title", "标签页");
+ editorHashMap.put("removeable", false);
+ editorHashMap.put("toolbar", "");
+ editorHashMap.put("visible", true);
+ break;
+ case "TabToolbarItem":
+ editorHashMap.put("id", "tabToolbarItem");
+ editorHashMap.put("type", "TabToolbarItem");
+ editorHashMap.put("title", "工具栏按钮");
+ editorHashMap.put("disable", false);
+ editorHashMap.put("visible", true);
+ break;
+ case "Section":
+ editorHashMap.put("id", "section1");
+ editorHashMap.put("type", "Section");
+ editorHashMap.put("visible", true);
+ editorHashMap.put("mainTitle", "");
+ editorHashMap.put("subTitle", "");
+ editorHashMap.put("headerClass", "");
+ editorHashMap.put("titleClass", "");
+ editorHashMap.put("extendedHeaderAreaClass", "");
+ editorHashMap.put("toolbarClass", "");
+ editorHashMap.put("extendedAreaClass", "");
+ editorHashMap.put("contentTemplateClass", "");
+ editorHashMap.put("fill", false);
+ editorHashMap.put("expanded", true);
+ editorHashMap.put("accordionMode", "default");
+ editorHashMap.put("showHeader", false);
+ editorHashMap.put("headerTemplate", "");
+ editorHashMap.put("titleTemplate", "");
+ editorHashMap.put("extendedHeaderAreaTemplate", "");
+ editorHashMap.put("toolbarTemplate", "");
+ editorHashMap.put("extendedAreaTemplate", "");
+ editorHashMap.put("isScrollSpyItem", false);
+
+ break;
+ case "ToolBarItem":
+ editorHashMap.put("id", "");
+ editorHashMap.put("type", "ToolBarItem");
+ editorHashMap.put("disable", false);
+ editorHashMap.put("visible", true);
+ editorHashMap.put("text", "");
+ break;
+ case "LanguageTextBox":
+ editorHashMap.put("id", "languageTextBox1");
+ editorHashMap.put("type", "LanguageTextBox");
+ editorHashMap.put("titleSourceType", "static");
+ editorHashMap.put("title", "多语控件");
+ editorHashMap.put("readonly", false);
+ editorHashMap.put("require", false);
+ editorHashMap.put("disable", false);
+ editorHashMap.put("enableClear", true);
+ editorHashMap.put("placeHolder", "");
+ editorHashMap.put("holdPlace", false);
+ editorHashMap.put("linkedLabelEnabled", false);
+ editorHashMap.put("visible", true);
+ editorHashMap.put("path", "");
+ editorHashMap.put("isTextArea", true);
+ editorHashMap.put("hasDefaultFocus", false);
+ editorHashMap.put("useFrameworkLanguage", true);
+ editorHashMap.put("editable", false);
+ editorHashMap.put("enableAppend", false);
+ editorHashMap.put("inputAppendType", "button");
+ editorHashMap.put("inputAppendDisabled", false);
+
+ break;
+ default:
+ throw new RuntimeException("未知的控件类型");
+ }
+ return editorHashMap;
+ }
+}
diff --git a/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/entity/DynamicCreateFormMetadataParameter.java b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/ComponentBinding.java
similarity index 73%
rename from web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/entity/DynamicCreateFormMetadataParameter.java
rename to web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/ComponentBinding.java
index 2ac4e8aa7dfd5d0a11d291f1cc4c92ed1555b42a..56e451501bad1e434ae2b5c12de7bfa2e591fef4 100644
--- a/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/entity/DynamicCreateFormMetadataParameter.java
+++ b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/ComponentBinding.java
@@ -14,11 +14,14 @@
* limitations under the License.
*/
-package com.inspur.edp.web.designschema.api.entity;
+package com.inspur.edp.web.dynamicform.core.components;
-/**
- * 动态创建表单元数据参数
- * @author guozhiqi
- */
-public class DynamicCreateFormMetadataParameter {
+import lombok.Data;
+
+@Data
+public class ComponentBinding {
+ private String type;
+ private String path;
+ private String field;
+ private String fullPath;
}
diff --git a/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/GridFieldComponentMetadata.java b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/GridFieldComponentMetadata.java
new file mode 100644
index 0000000000000000000000000000000000000000..8422d212d69b24439d3d81501ec8d193da1b4f9c
--- /dev/null
+++ b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/GridFieldComponentMetadata.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.dynamicform.core.components;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.inspur.edp.web.common.serialize.SerializeUtility;
+
+import java.util.HashMap;
+
+public class GridFieldComponentMetadata {
+ public static HashMap getDefaultGridFieldMetadata() {
+ return SerializeUtility.getInstance().deserialize("{\n" +
+ " \"id\": \"col\",\n" +
+ " \"type\": \"GridField\",\n" +
+ " \"controlSource\": \"Farris\",\n" +
+ " \"caption\": \"\",\n" +
+ " \"captionTemplate\": null,\n" +
+ " \"dataField\": \"\",\n" +
+ " \"dataType\": \"\",\n" +
+ " \"binding\": null,\n" +
+ " \"enumData\": null,\n" +
+ " \"appearance\": null,\n" +
+ " \"size\": {\n" +
+ " \"width\": 120\n" +
+ " },\n" +
+ " \"displayTemplate\": null,\n" +
+ " \"editor\": null,\n" +
+ " \"draggable\": false,\n" +
+ " \"frozen\": \"none\",\n" +
+ " \"sortable\": true,\n" +
+ " \"sortOrder\": null,\n" +
+ " \"resizeable\": true,\n" +
+ " \"aggregate\": { \"type\": \"none\", \"formatter\": { \"type\": \"none\" } },\n" +
+ " \"groupAggregate\": { \"type\": \"none\", \"formatter\": { \"type\": \"none\" } },\n" +
+ " \"styler\": \"\",\n" +
+ " \"colTemplate\": \"\",\n" +
+ " \"linkedLabelEnabled\": false,\n" +
+ " \"linkedLabelClick\": null,\n" +
+ " \"textAlign\": \"left\",\n" +
+ " \"hAlign\": \"left\",\n" +
+ " \"vAlign\": \"middle\",\n" +
+ " \"formatter\": { \"type\": \"none\" },\n" +
+ " \"showTips\": false,\n" +
+ " \"tipContent\": null,\n" +
+ " \"multiLanguage\": false,\n" +
+ " \"enableFilter\": false,\n" +
+ " \"headerStyler\": \"\",\n" +
+ " \"localization\": false,\n" +
+ " \"idField\": \"value\",\n" +
+ " \"textField\": \"name\"\n" +
+ " }", HashMap.class);
+ }
+}
diff --git a/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/QuerySchemaField.java b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/QuerySchemaField.java
new file mode 100644
index 0000000000000000000000000000000000000000..c587daa2c22ecdb3e95a02848317488b0c9d333e
--- /dev/null
+++ b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/components/QuerySchemaField.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.dynamicform.core.components;
+
+import lombok.Data;
+
+import java.util.HashMap;
+
+/**
+ * 筛选方案字段
+ *
+ * @author guozhiqi
+ */
+@Data
+public class QuerySchemaField {
+ private String id;
+ private String labelCode;
+ private String code;
+
+ private String name;
+
+ private QuerySchemaFieldControl control;
+
+ /**
+ * 从dom结构 构造对应的筛选方案字段
+ *
+ * @param componentItem
+ * @return
+ */
+ public static QuerySchemaField fromComponentItem(HashMap componentItem) {
+ QuerySchemaField querySchemaField = new QuerySchemaField();
+
+ return querySchemaField;
+ }
+
+
+ /**
+ * 筛选方案字段 control属性参数
+ */
+ @Data
+ public static class QuerySchemaFieldControl {
+ private String id;
+ private String controltype;
+ private boolean require;
+ private String className;
+
+ }
+
+ /**
+ * text field control
+ */
+ public static class QuerySchemaTextFieldControl extends QuerySchemaFieldControl {
+ {
+ this.setControltype("text");
+ this.setRequire(false);
+ this.setClassName("");
+ }
+ }
+
+ /**
+ * single-number control
+ */
+ @Data
+ public static class QuerySchemaSingleNumberFieldControl extends QuerySchemaFieldControl {
+ {
+ this.setControltype("single-number");
+ this.setRequire(false);
+ this.setClassName("");
+ this.setTextAlign("left");
+ }
+
+ private String textAlign;
+ private double precision;
+
+ private boolean isBigNumber;
+ }
+
+ /**
+ * number field control
+ */
+ @Data
+ public static class QuerySchemaNumberFieldControl extends QuerySchemaSingleNumberFieldControl {
+ {
+ this.setControltype("number");
+ this.setRequire(false);
+ this.setClassName("");
+ this.setTextAlign("left");
+ }
+ }
+
+ @Data
+ public static class QuerySchemaSingleDateFieldControl extends QuerySchemaFieldControl {
+ private String format;
+
+ {
+ this.setControltype("single-date");
+ this.setRequire(false);
+ this.setFormat("yyyy-MM-dd");
+ }
+ }
+
+ @Data
+ public static class QuerySchemaDateFieldControl extends QuerySchemaFieldControl {
+ private boolean weekSelect;
+ private String format;
+
+ {
+ this.setControltype("date");
+ this.setRequire(false);
+ this.setFormat("yyyy-MM-dd");
+ this.setWeekSelect(false);
+ }
+ }
+
+ @Data
+ public static class QuerySchemaDropdownFieldControl extends QuerySchemaFieldControl {
+ private String valueType;
+ private Object enumValues;
+ private boolean multiSelect;
+ private double panelHeight;
+
+ {
+ this.setControltype("dropdown");
+ this.setRequire(false);
+ this.setValueType("1");
+ this.setClassName("");
+ this.setMultiSelect(false);
+ }
+
+ }
+}
diff --git a/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/configuration/DynamicFormConfiguration.java b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/configuration/DynamicFormConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..543acad1fc18de58ab8a6f456d3a64692f65d468
--- /dev/null
+++ b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/configuration/DynamicFormConfiguration.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.dynamicform.core.configuration;
+
+import com.inspur.edp.web.dynamicform.core.api.service.DynamicCreateFormMetadataService;
+import com.inspur.edp.web.dynamicform.core.service.DynamicCreateFormMetadataServiceImpl;
+import com.inspur.edp.web.dynamicform.core.webservice.DynamicFormWebServiceImpl;
+import io.iec.edp.caf.rest.RESTEndpoint;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+/**
+ * 动态创建表单web 配置
+ *
+ * @author guozhiqi
+ */
+@Configuration
+public class DynamicFormConfiguration {
+ @Bean()
+ public RESTEndpoint dynamicFormWebServiceEndpoint() {
+ return new RESTEndpoint("/dev/main/v1.0/dynamicform", new DynamicFormWebServiceImpl());
+ }
+
+ @Bean
+ public DynamicCreateFormMetadataService getDynamicCreateFormMetadataService() {
+ return new DynamicCreateFormMetadataServiceImpl();
+ }
+}
diff --git a/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/service/DynamicCreateFormMetadataServiceImpl.java b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/service/DynamicCreateFormMetadataServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f2592aca4e977153e45b14a68c433d4625f0dfc
--- /dev/null
+++ b/web-dynamic-form-core/src/main/java/com/inspur/edp/web/dynamicform/core/service/DynamicCreateFormMetadataServiceImpl.java
@@ -0,0 +1,490 @@
+/*
+ * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
+ *
+ * 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.web.dynamicform.core.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.inspur.edp.formserver.viewmodel.GspViewModel;
+import com.inspur.edp.lcm.metadata.api.IMetadataContent;
+import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
+import com.inspur.edp.lcm.metadata.api.entity.MetadataHeader;
+import com.inspur.edp.lcm.metadata.spi.event.MetadataEventArgs;
+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.MetadataGetterParameter;
+import com.inspur.edp.web.common.metadata.MetadataTypeEnum;
+import com.inspur.edp.web.common.metadata.MetadataUtility;
+import com.inspur.edp.web.common.serialize.SerializeUtility;
+import com.inspur.edp.web.common.utility.DateUtility;
+import com.inspur.edp.web.common.utility.RandomUtility;
+import com.inspur.edp.web.common.utility.StringUtility;
+import com.inspur.edp.web.designschema.elements.Field;
+import com.inspur.edp.web.designschema.elements.Schema;
+import com.inspur.edp.web.designschema.elements.SimpleField;
+import com.inspur.edp.web.designschema.generator.SchemaBuilder;
+import com.inspur.edp.web.dynamicform.core.api.customexception.DynamicFormException;
+import com.inspur.edp.web.dynamicform.core.api.entity.DynamicCreateFormMetadataParameter;
+import com.inspur.edp.web.dynamicform.core.api.entity.FormMetadataInfo;
+import com.inspur.edp.web.dynamicform.core.api.entity.FormMetadataTemplateInfo;
+import com.inspur.edp.web.dynamicform.core.api.service.DynamicCreateFormMetadataService;
+import com.inspur.edp.web.dynamicform.core.components.CardTemplateEditorGenerator;
+import com.inspur.edp.web.dynamicform.core.components.ComponentBinding;
+import com.inspur.edp.web.dynamicform.core.components.GridFieldComponentMetadata;
+import com.inspur.edp.web.dynamicform.core.components.QuerySchemaField;
+import com.inspur.edp.web.dynamicform.core.statemachine.StateMachineMetadataGenerator;
+import com.inspur.edp.web.formmetadata.metadata.FormMetadataContent;
+import com.inspur.edp.web.formmetadata.metadata.formdom.FormDOM;
+import com.inspur.edp.web.formmetadata.metadata.formdom.FormOptions;
+import com.inspur.edp.web.pageflow.metadata.service.PageFlowMetadataUpdateService;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+/**
+ * 动态创建表单
+ *
+ * @author guozhiqi
+ */
+public class DynamicCreateFormMetadataServiceImpl implements DynamicCreateFormMetadataService {
+ @Override
+ public ResultMessage create(DynamicCreateFormMetadataParameter parameter) {
+ // 入参校验 主要针对需要必须填写的内容进行验证
+ this.createParameterValidate(parameter);
+
+ ResultMessage resultMessage = ResultCode.success();
+
+
+ String formMetadataRelativePath = FileUtility.getPlatformIndependentPath(FileUtility.combine(parameter.getProjectPath(), "components"));
+ // 此处应该可能存在同时多个表单创建的情况 此处先使用第一个
+ if (!parameter.getFormMetadataInfoList().isEmpty()) {
+ for (FormMetadataInfo metadataInfoItem : parameter.getFormMetadataInfoList()) {
+ GspMetadata formListMetadata = new GspMetadata();
+ formListMetadata.setRelativePath(formMetadataRelativePath);
+ MetadataHeader metadataHeader = new MetadataHeader();
+ metadataHeader.setName(metadataInfoItem.getName());
+ metadataHeader.setCode(metadataInfoItem.getCode());
+ metadataHeader.setFileName(metadataInfoItem.getCode() + ".frm");
+ metadataHeader.setId(RandomUtility.newGuid());
+ metadataHeader.setNameSpace(parameter.getProjectNameSpace());
+ metadataHeader.setBizobjectID(parameter.getBizobjectID());
+ metadataHeader.setType("Form");
+
+ formListMetadata.setHeader(metadataHeader);
+
+ // 读取资源文件中模板信息
+ FormMetadataTemplateInfo formMetadataTemplateInfo = metadataInfoItem.getTemplateInfo();
+ String templateFilePath = FileUtility.getPlatformIndependentPath(FileUtility.combine(FileUtility.getCurrentWorkPath(false), "web\\platform\\dev\\main\\web\\webide\\plugins\\form-create-wizard\\assets\\templates\\form-template\\" + formMetadataTemplateInfo.getTemplateId() + ".json"));
+ String templateContent = FileUtility.readAsString(templateFilePath);
+
+ FormMetadataContent formMetadataContent = new FormMetadataContent();
+ formMetadataContent.setId(metadataHeader.getId());
+ formMetadataContent.setCode(metadataInfoItem.getCode());
+ formMetadataContent.setName(metadataInfoItem.getName());
+ formMetadataContent.setCreationDate(DateUtility.convertFromLocalDateTime(LocalDateTime.now()));
+
+ FormDOM formDOM = SerializeUtility.getInstance().deserialize(templateContent, FormDOM.class);
+ // 读取VO元数据 进行表单参数构造
+ MetadataGetterParameter metadataGetterParameter = MetadataGetterParameter.getNewInstance(metadataInfoItem.getVoMetadataId(), FileUtility.getPlatformIndependentPath(parameter.getProjectPath()), MetadataTypeEnum.ViewModel);
+ GspMetadata voMetadata = MetadataUtility.getInstance().getMetadataWithDesign(metadataGetterParameter);
+ IMetadataContent voMetaContent = voMetadata.getContent();
+ GspViewModel gspViewModel = (GspViewModel) voMetaContent;
+ SchemaBuilder schemaBuilder = new SchemaBuilder();
+ Schema schema = schemaBuilder.buildWithScene(gspViewModel, "", false);
+ schema.setId(voMetadata.getHeader().getId());
+ schema.setCode(metadataInfoItem.getCode());
+
+ // 设置对应eapi的sourceUri
+ // 如果未传递对应的sourceUri 那么使用当前表单进行自定义uri
+ if (StringUtility.isNullOrEmpty(metadataInfoItem.getEapiSourceUri())) {
+ String[] relativePathArr = formMetadataRelativePath.split("/");
+ String strSourceUri = ("/api/" + relativePathArr[0] + "/" + relativePathArr[1] + "/v1.0/" + metadataInfoItem.getCode()).toLowerCase();
+ schema.setSourceUri(strSourceUri);
+ } else {
+ schema.setSourceUri(metadataInfoItem.getEapiSourceUri());
+ }
+
+ List schemaList = new ArrayList() {{
+ this.add(schema);
+ }};
+
+ String serializedSchema = SerializeUtility.getInstance().serialize(schemaList);
+ ArrayList> deserializedSchema = SerializeUtility.getInstance().deserialize(serializedSchema, ArrayList.class);
+ formDOM.getModule().setSchemas(deserializedSchema);
+
+ formDOM.getModule().setId(metadataInfoItem.getCode());
+ formDOM.getModule().setCode(metadataInfoItem.getCode());
+ formDOM.getModule().setName(metadataInfoItem.getName());
+ formDOM.getModule().setCreator("Noah");
+ formDOM.getModule().setCreationDate(DateUtility.getCurrentDateTime());
+ formDOM.getModule().setCaption(metadataInfoItem.getName());
+ formDOM.getModule().setType("Module");
+ formDOM.getModule().setShowTitle(true);
+ formDOM.getModule().setBootstrap(metadataInfoItem.getTemplateInfo().getTemplateId());
+ formDOM.getModule().setTemplateId(metadataInfoItem.getTemplateInfo().getTemplateId());
+
+ // 设置扩展信息
+ formDOM.setOptions(new FormOptions() {
+ {
+ this.setEnableTextArea(true);
+ this.setRenderMode("compile");
+ }
+ });
+
+ // 状态机元数据保存
+ StateMachineMetadataGenerator.saveStateMachineAndRefreshForm(parameter, formMetadataRelativePath, metadataInfoItem, formListMetadata, formDOM);
+
+
+ if (formDOM.getModule().getComponents() != null) {
+
+ formDOM.getModule().getComponents().forEach(componentItem -> {
+ if (Objects.equals(componentItem.get("id"), "root-component")) {
+ if (metadataInfoItem.getTemplateInfo().isListTemplate()) {
+ componentItem.put("onInit", "Filter1");
+ } else if (metadataInfoItem.getTemplateInfo().isNewCardTemplate()) {
+ componentItem.put("onInit", "Load1");
+ }
+ }
+
+ // 当前的componentId
+ String currentComponentId = componentItem.get("id").toString();
+
+ this.rescureHashMapWithContents(componentItem, (childItem) -> {
+ if (Objects.equals(childItem.get("id"), "header-title-container") && childItem.get("contents") instanceof ArrayList) {
+ ArrayList> headerTitleContainerContents = (ArrayList>) childItem.get("contents");
+ headerTitleContainerContents.forEach(headerItem -> {
+ if (Objects.equals(headerItem.get("type"), "HtmlTemplate")) {
+ String strHeaderHtml = headerItem.get("html").toString();
+ strHeaderHtml = strHeaderHtml.replace("${title}", metadataInfoItem.getName());
+ // 移除模板中的${formCode} 无效字符串
+ strHeaderHtml = strHeaderHtml.replace("${formCode}", "");
+ headerItem.put("html", strHeaderHtml);
+ }
+ });
+ }
+
+ if (metadataInfoItem.getTemplateInfo().isListTemplate() &&
+ Objects.equals(childItem.get("id"), "dataGrid")) {
+ // 选中对应的列表
+ childItem.computeIfPresent("fields", (k, v) -> new ArrayList