From 51ebb7c73e70754a58b46b8725295a8d95902f27 Mon Sep 17 00:00:00 2001 From: canonical Date: Fri, 23 Aug 2024 22:23:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=9D=9E=E7=A7=9F=E6=88=B7?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E4=B8=8B=E5=8A=A8=E6=80=81=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=9A=84=E6=9F=A5=E6=89=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nop-cli-core/reflect-config.json | 44 +++++++++++++++++++ .../src/main/resources/nop-vfs-index.txt | 1 - .../io/nop/core/module/ModuleManager.java | 11 ++++- .../src/main/resources/nop-vfs-index.txt | 2 + .../resources/_vfs/i18n/en/_nop-dyn.i18n.yaml | 34 ++++++++++++++ .../_vfs/i18n/zh-CN/_nop-dyn.i18n.yaml | 34 ++++++++++++++ .../service/codegen/InMemoryCodeCache.java | 5 ++- .../dyn/service/codegen/TestDynCodeGen.java | 11 +++++ .../java/io/nop/orm/IOrmSessionFactory.java | 2 +- .../nop/orm/factory/SessionFactoryImpl.java | 4 +- 10 files changed, 142 insertions(+), 6 deletions(-) diff --git a/nop-cli-core/src/main/resources/META-INF/native-image/io.github.entropy-cloud/nop-cli-core/reflect-config.json b/nop-cli-core/src/main/resources/META-INF/native-image/io.github.entropy-cloud/nop-cli-core/reflect-config.json index e2990fac3..88d38c530 100644 --- a/nop-cli-core/src/main/resources/META-INF/native-image/io.github.entropy-cloud/nop-cli-core/reflect-config.json +++ b/nop-cli-core/src/main/resources/META-INF/native-image/io.github.entropy-cloud/nop-cli-core/reflect-config.json @@ -2426,6 +2426,10 @@ "name": "clone", "parameterTypes": [] }, + { + "name": "destroyOnRemove", + "parameterTypes": [] + }, { "name": "expireAfterAccess", "parameterTypes": [ @@ -15209,6 +15213,14 @@ "name": "getExpandType", "parameterTypes": [] }, + { + "name": "getExportFormattedValue", + "parameterTypes": [] + }, + { + "name": "getExportFormula", + "parameterTypes": [] + }, { "name": "getField", "parameterTypes": [] @@ -15367,12 +15379,24 @@ "boolean" ] }, + { + "name": "setExportFormattedValue", + "parameterTypes": [ + "java.lang.Boolean" + ] + }, { "name": "setExportFormula", "parameterTypes": [ "boolean" ] }, + { + "name": "setExportFormula", + "parameterTypes": [ + "java.lang.Boolean" + ] + }, { "name": "setField", "parameterTypes": [ @@ -17805,6 +17829,12 @@ { "name": "reloadOrmModel", "parameterTypes": [] + }, + { + "name": "setOrmModelHolder", + "parameterTypes": [ + "io.nop.orm.factory.IOrmModelHolder" + ] } ], "name": "io.nop.orm.factory.OrmSessionFactoryBean", @@ -18857,6 +18887,10 @@ "name": "isTableView", "parameterTypes": [] }, + { + "name": "isTenantModel", + "parameterTypes": [] + }, { "name": "isUseGlobalCache", "parameterTypes": [] @@ -19412,6 +19446,10 @@ "name": "isGlobalUniqueId", "parameterTypes": [] }, + { + "name": "isTenantModel", + "parameterTypes": [] + }, { "name": "setDependByOtherEntity", "parameterTypes": [ @@ -19430,6 +19468,12 @@ "java.util.List" ] }, + { + "name": "setTenantModel", + "parameterTypes": [ + "boolean" + ] + }, { "name": "toString", "parameterTypes": [] diff --git a/nop-cli-core/src/main/resources/nop-vfs-index.txt b/nop-cli-core/src/main/resources/nop-vfs-index.txt index c25d82b67..157c137e8 100644 --- a/nop-cli-core/src/main/resources/nop-vfs-index.txt +++ b/nop-cli-core/src/main/resources/nop-vfs-index.txt @@ -105,7 +105,6 @@ /nop/report/xlib/xpt-rt.xlib /nop/report/xlib/xpt.xlib /nop/rpc/imp/api.imp.xml -/nop/rpc/imp/api.imp.xml.rej /nop/rpc/imp/template.api.xlsx /nop/schema/action-auth.xdef /nop/schema/api.xdef diff --git a/nop-core/src/main/java/io/nop/core/module/ModuleManager.java b/nop-core/src/main/java/io/nop/core/module/ModuleManager.java index 6480d4c16..c0550704d 100644 --- a/nop-core/src/main/java/io/nop/core/module/ModuleManager.java +++ b/nop-core/src/main/java/io/nop/core/module/ModuleManager.java @@ -42,6 +42,8 @@ public class ModuleManager { private static ModuleManager _instance = new ModuleManager(); + private final AtomicReference> dynamicModules = new AtomicReference<>(); + public static void registerInstance(ModuleManager instance) { _instance = instance; } @@ -122,6 +124,10 @@ public Map getEnabledModuleMap(boolean includeTenant) { ret.putAll(map); } + Map dynamics = dynamicModules.get(); + if (dynamics != null) + ret.putAll(dynamics); + if (includeTenant) { String tenantId = getTenantId(); if (!StringHelper.isEmpty(tenantId) && ResourceTenantManager.instance().getTenantModuleDiscovery() != null) { @@ -134,9 +140,12 @@ public Map getEnabledModuleMap(boolean includeTenant) { return ret; } + public void updateDynamicModules(Map dynamicModules) { + this.dynamicModules.set(dynamicModules); + } + public Collection getEnabledModules(boolean includeTenant) { return getEnabledModuleMap(includeTenant).values(); - } public Set getEnabledModuleNames(boolean includeTenant) { diff --git a/nop-demo/nop-quarkus-demo/src/main/resources/nop-vfs-index.txt b/nop-demo/nop-quarkus-demo/src/main/resources/nop-vfs-index.txt index 65b522ecd..f9f528e2a 100644 --- a/nop-demo/nop-quarkus-demo/src/main/resources/nop-vfs-index.txt +++ b/nop-demo/nop-quarkus-demo/src/main/resources/nop-vfs-index.txt @@ -421,6 +421,7 @@ /nop/dyn/model/NopDynFunctionMeta/_NopDynFunctionMeta.xbiz /nop/dyn/model/NopDynFunctionMeta/_NopDynFunctionMeta.xmeta /nop/dyn/model/NopDynModule/NopDynModule.xbiz +/nop/dyn/model/NopDynModule/NopDynModule.xbiz.rej /nop/dyn/model/NopDynModule/NopDynModule.xmeta /nop/dyn/model/NopDynModule/_NopDynModule.xbiz /nop/dyn/model/NopDynModule/_NopDynModule.xmeta @@ -1059,6 +1060,7 @@ /nop/web/xlib/view-gen.xlib /nop/web/xlib/view-gen/impl_GenFromMeta.xpl /nop/web/xlib/web.xlib +/nop/web/xlib/web.xlib.rej /nop/web/xlib/web/grid_crud.xpl /nop/web/xlib/web/impl_GenForm.xpl /nop/web/xlib/web/impl_GenGrid.xpl diff --git a/nop-dyn/nop-dyn-meta/src/main/resources/_vfs/i18n/en/_nop-dyn.i18n.yaml b/nop-dyn/nop-dyn-meta/src/main/resources/_vfs/i18n/en/_nop-dyn.i18n.yaml index cc90110fe..3eac5aec4 100644 --- a/nop-dyn/nop-dyn-meta/src/main/resources/_vfs/i18n/en/_nop-dyn.i18n.yaml +++ b/nop-dyn/nop-dyn-meta/src/main/resources/_vfs/i18n/en/_nop-dyn.i18n.yaml @@ -12,6 +12,8 @@ entity: NopDynModule: Module Definition NopDynModuleDep: Module Dependency NopDynPage: Page Definition + NopDynPatch: Patch + NopDynPatchFile: Patch File NopDynPropMeta: Property Meta NopDynSql: Module SQL prop: @@ -271,6 +273,38 @@ prop: module: Module module.displayName: Module pageContentComponent: null + NopDynPatch: + patchId: Patch ID + patchName: Patch Name + patchOrder: Patch Order + displayName: Display Name + status: Status + version: Version + createdBy: Created By + createTime: Create Time + updatedBy: Updated By + updateTime: Update Time + patchFiles: Patch Files + NopDynPatchFile: + fileId: File ID + patchId: Patch ID + moduleId: Module ID + filePath: File Path + fileName: File Name + fileType: File Type + fileLength: File Length + status: Status + status_label: null + version: Version + createdBy: Created By + createTime: Create Time + updatedBy: Updated By + updateTime: Update Time + remark: Remark + module: Module + module.displayName: Module + patch: Patch + patch.displayName: Patch NopDynPropMeta: propMetaId: Prop Meta ID entityMetaId: Entity Meta ID diff --git a/nop-dyn/nop-dyn-meta/src/main/resources/_vfs/i18n/zh-CN/_nop-dyn.i18n.yaml b/nop-dyn/nop-dyn-meta/src/main/resources/_vfs/i18n/zh-CN/_nop-dyn.i18n.yaml index cd260ec60..2c6b2de1e 100644 --- a/nop-dyn/nop-dyn-meta/src/main/resources/_vfs/i18n/zh-CN/_nop-dyn.i18n.yaml +++ b/nop-dyn/nop-dyn-meta/src/main/resources/_vfs/i18n/zh-CN/_nop-dyn.i18n.yaml @@ -12,6 +12,8 @@ entity: NopDynModule: 模块定义 NopDynModuleDep: 模块依赖 NopDynPage: 页面定义 + NopDynPatch: 补丁定义 + NopDynPatchFile: 补丁文件 NopDynPropMeta: 属性元数据 NopDynSql: SQL定义 prop: @@ -271,6 +273,38 @@ prop: updateTime: 修改时间 updatedBy: 修改人 version: 数据版本 + NopDynPatch: + createTime: 创建时间 + createdBy: 创建人 + displayName: 显示名 + patchFiles: 补丁文件 + patchId: 补丁ID + patchName: 补丁名 + patchOrder: 补丁顺序 + status: 状态 + updateTime: 修改时间 + updatedBy: 修改人 + version: 数据版本 + NopDynPatchFile: + createTime: 创建时间 + createdBy: 创建人 + fileId: 文件ID + fileLength: 文件大小 + fileName: 文件名称 + filePath: 文件路径 + fileType: 文件类型 + module: 所属模块 + module.displayName: 所属模块 + moduleId: 模块ID + patch: 所属补丁 + patch.displayName: 所属补丁 + patchId: 补丁ID + remark: 备注 + status: 状态 + status_label: 状态 + updateTime: 修改时间 + updatedBy: 修改人 + version: 数据版本 NopDynPropMeta: createTime: 创建时间 createdBy: 创建人 diff --git a/nop-dyn/nop-dyn-service/src/main/java/io/nop/dyn/service/codegen/InMemoryCodeCache.java b/nop-dyn/nop-dyn-service/src/main/java/io/nop/dyn/service/codegen/InMemoryCodeCache.java index 21492b893..d7cfa2e33 100644 --- a/nop-dyn/nop-dyn-service/src/main/java/io/nop/dyn/service/codegen/InMemoryCodeCache.java +++ b/nop-dyn/nop-dyn-service/src/main/java/io/nop/dyn/service/codegen/InMemoryCodeCache.java @@ -7,6 +7,7 @@ import io.nop.codegen.XCodeGenerator; import io.nop.commons.util.StringHelper; import io.nop.core.lang.eval.IEvalScope; +import io.nop.core.module.ModuleManager; import io.nop.core.module.ModuleModel; import io.nop.core.resource.IResource; import io.nop.core.resource.ResourceHelper; @@ -257,7 +258,8 @@ public synchronized void generateBizModel(NopDynEntityMeta entityMeta) { } } - public synchronized void reloadModel(IOrmSessionFactory ormSessionFactory, IBizObjectManager bizObjectManager) { + public synchronized void reloadModel(IOrmSessionFactory ormSessionFactory, + IBizObjectManager bizObjectManager) { InMemoryResourceStore merged = new InMemoryResourceStore(); this.moduleCoreStores.values().forEach(merged::merge); @@ -272,6 +274,7 @@ public synchronized void reloadModel(IOrmSessionFactory ormSessionFactory, IBizO ResourceTenantManager.instance().updateTenantResourceStore(tenantId, merged); } else { VirtualFileSystem.instance().updateInMemoryLayer(merged); + ModuleManager.instance().updateDynamicModules(dynModules); } ormSessionFactory.reloadModel(); diff --git a/nop-dyn/nop-dyn-service/src/test/java/io/nop/dyn/service/codegen/TestDynCodeGen.java b/nop-dyn/nop-dyn-service/src/test/java/io/nop/dyn/service/codegen/TestDynCodeGen.java index 6e0a7f04f..f3b5e9fdc 100644 --- a/nop-dyn/nop-dyn-service/src/test/java/io/nop/dyn/service/codegen/TestDynCodeGen.java +++ b/nop-dyn/nop-dyn-service/src/test/java/io/nop/dyn/service/codegen/TestDynCodeGen.java @@ -48,13 +48,21 @@ public class TestDynCodeGen extends JunitBaseTestCase { @Inject IGraphQLEngine graphQLEngine; + @Inject + DynOrmModelHolder ormModelHolder; // 单元测试时所有的bean都是延迟初始化,这里引入bean强制要求初始化 + @Test public void testGen() { saveModule(); ormTemplate.runInSession(() -> { codeGen.generateForAllModules(); + + // 更新模型后在当前session中不可见,需要在下一次打开session时才课教案 codeGen.reloadModel(); + }); + + ormTemplate.runInSession(() -> { IEntityDao dao = daoProvider.dao("MyDynEntity"); dao.findAll(); @@ -81,6 +89,9 @@ public void testGenBizModel() { ormTemplate.runInSession(() -> { codeGen.generateForAllModules(); codeGen.reloadModel(); + }); + + ormTemplate.runInSession(() -> { NopDynFunctionMeta func = getFuncMeta("myMethod"); func.setSource("return 321"); diff --git a/nop-orm/src/main/java/io/nop/orm/IOrmSessionFactory.java b/nop-orm/src/main/java/io/nop/orm/IOrmSessionFactory.java index a6afcfff9..e6fe012f5 100644 --- a/nop-orm/src/main/java/io/nop/orm/IOrmSessionFactory.java +++ b/nop-orm/src/main/java/io/nop/orm/IOrmSessionFactory.java @@ -69,5 +69,5 @@ ICompiledSql compileSql(String name, String sqlText, boolean disableLogicalDelet IQueryExecutor getQueryExecutor(String querySpace); - void reloadModel(); + ILoadedOrmModel reloadModel(); } \ No newline at end of file diff --git a/nop-orm/src/main/java/io/nop/orm/factory/SessionFactoryImpl.java b/nop-orm/src/main/java/io/nop/orm/factory/SessionFactoryImpl.java index 486fc12e8..b9c4dd940 100644 --- a/nop-orm/src/main/java/io/nop/orm/factory/SessionFactoryImpl.java +++ b/nop-orm/src/main/java/io/nop/orm/factory/SessionFactoryImpl.java @@ -447,8 +447,8 @@ public Object getBean(String name, boolean mustPrototype) { } @Override - public void reloadModel() { + public ILoadedOrmModel reloadModel() { ormModelHolder.clearCache(); - ormModelHolder.getOrmModel(this); + return ormModelHolder.getOrmModel(this); } }